假设我有以下基类:
[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成员的值未序列化。
两个注意事项:
- 可以看到 add 的
BaseType成员ProtoBuf.Meta.MetaType设置为null,导致effectiveDatespan成员没有被序列化;相反,如果我编译模型,则它的BaseType成员被正确设置为DimensionEntity(尽管它稍后会失败,因为成员是这样的private readonly,因此编译模型无法访问); - 当然,我可以声明
ClearingSite为 的已知类型DimensionEntity,但我不明白为什么需要这样做:我没有序列化 aDimensionEntity,我正在序列化(和反序列化) aClearingSite,而且DataContractSerializer不需要我添加如果我正在序列化KnownType一个.DimensionEntityClearingSite
从 Marc 的其他答案来看,Protobuf 似乎需要KnownType(or ProtoInclude) 属性才能获得“所有重要的字段编号”(引用),但情况似乎并非如此,因为CompiledModel没有ProtoInclude.
请注意,我正在努力System.Runtime.Serialization仅使用属性,因为我试图让我的对象模型不知道序列化程序在路上。