このようなクラス階層があります。これらのクラスには、私が除外した他の多くの詳細が含まれています。これは、これらのクラスのシリアル化の側面に焦点を当てるための単純化です。
[ProtoInclude(1, typeof(Query<bool>))]
[ProtoInclude(2, typeof(Query<string>))]
[ProtoInclude(3, typeof(Query<int>))]
[ProtoInclude(4, typeof(Query<decimal>))]
[ProtoInclude(5, typeof(Query<DataSet>))]
abstract class Query
{
public string Result { get; set; }
}
[ProtoInclude(1, typeof(SpecialQuery)]
abstract class Query<T> : Query
{
public new T Result { get; set; }
}
abstract class SpecialQuery : Query<DataSet>
{
public new string Result { get; set; }
}
また、多種多様なジェネリック型を持つジェネリック Query の自動生成された子孫が約 150 あります。例えば:
[ProtoContract]
class W : Query<bool>
{
}
[ProtoContract]
class X : Query<string>
{
}
[ProtoContract]
class Y : Query<int>
{
}
[ProtoContract]
class Z : SpecialQuery
{
}
これらすべてのタイプに対して [ProtoInclude] も自動生成しました。例えば:
[ProtoInclude(1, typeof(W)]
[ProtoInclude(2, typeof(X)]
[ProtoInclude(3, typeof(Y)]
[ProtoInclude(4, typeof(Z)]
問題は、これらの 150 個の ProtoIncludes をどのようにデプロイするかです。論理的に見えるさまざまな組み合わせを試しましたが、どの属性がどこに存在するかに応じてさまざまな例外が発生します。上記の例で実際にシリアル化が必要な型は、W、X、Y、Z で、約 150 個しかありません。
protobuf-net はこのようなものにも対処できますか、それとも他の種類のシリアル化を試す必要がありますか?