次の基本クラスがあるとします。
[DataContract]
[Serializable]
public abstract class DimensionEntity
{
[DataMember(Order = 1)]
private readonly Date effectiveDatespan;
...
}
そして、次の派生クラス:
[DataContract]
[Serializable]
public class ClearingSite : DimensionEntity
{
[DataMember(Order = 1)]
private readonly string code;
...
}
次のようにインスタンスをシリアル化するとClearingSite
、次のようになります。
model.Add(typeof(ClearingSite), true);
model.Serialize(ms, clearingSite);
code
のメンバーのみClearingSite
がシリアル化されていることがわかります。基本クラスのeffectiveDatespan
メンバーの値はシリアル化されません。
2つのメモ:
BaseType
addのメンバーProtoBuf.Meta.MetaType
がに設定されているためnull
、effectiveDatespan
メンバーがシリアル化されていないことがわかります。代わりに、モデルをコンパイルすると、そのBaseType
メンバーは正しく設定されます(ただし、メンバーはコンパイルされたモデルからアクセスできないためDimensionEntity
、後で失敗します)。private readonly
- もちろん
ClearingSite
、既知のタイプとして宣言するDimensionEntity
ことはできますが、なぜこれが必要になるのかわかりません。シリアル化していないDimensionEntity
、シリアル化(および逆シリアル化)しているClearingSite
、さらにDataContractSerializer
追加する必要がないKnownType
をDimensionEntity
シリアル化する場合にClearingSite
。
Marcからの他の回答から、Protobufは「すべての重要なフィールド番号」(引用符)を取得するためにKnownType
(または)属性を必要とするように見えますが、。がなくても完全に正常に機能ProtoInclude
するため、そうではないようです。CompiledModel
ProtoInclude
System.Runtime.Serialization
オブジェクトモデルが将来的にシリアライザーを認識しないようにしようとしているので、属性のみを使用するように努めていることに注意してください。