假设我有以下基类:
[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
一个.DimensionEntity
ClearingSite
从 Marc 的其他答案来看,Protobuf 似乎需要KnownType
(or ProtoInclude
) 属性才能获得“所有重要的字段编号”(引用),但情况似乎并非如此,因为CompiledModel
没有ProtoInclude
.
请注意,我正在努力System.Runtime.Serialization
仅使用属性,因为我试图让我的对象模型不知道序列化程序在路上。