【发布时间】:2012-05-01 16:06:55
【问题描述】:
假设我有以下基类:
[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);
我可以看到只有ClearingSite的code成员被序列化了;基类'effectiveDatespan 成员的值未序列化。
两个音符:
- 可以看到添加的
ProtoBuf.Meta.MetaType的BaseType成员设置为null,导致effectiveDatespan成员没有被序列化;相反,如果我编译模型,则其BaseType成员被正确设置为DimensionEntity(尽管稍后它会失败,因为成员是private readonly,因此编译模型无法访问); - 当然我可以将
ClearingSite声明为DimensionEntity的已知类型,但我不明白为什么需要这样做:我没有序列化DimensionEntity,我正在序列化(和反序列化) 一个ClearingSite,此外,如果我正在序列化一个ClearingSite,DataContractSerializer不需要我将KnownType添加到DimensionEntity。
从 Marc 的其他答案看来,Protobuf 似乎需要 KnownType(或 ProtoInclude)属性才能获得“最重要的字段编号”(引用),但这似乎不是情况下,CompiledModel 在没有ProtoInclude 的情况下完全可以正常工作。
请注意,我正在努力仅使用 System.Runtime.Serialization 属性,因为我试图让我的对象模型不知道未来的序列化程序。
【问题讨论】:
标签: protobuf-net