假设我有以下基类:
[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
不需要我向DimensionEntity
添加KnownType
。
从 Marc 的其他答案来看,看起来 Protobuf 需要 KnownType
(或 ProtoInclude
(属性才能获得"最重要的字段编号"(引用(,但情况似乎并非如此,因为CompiledModel
在没有ProtoInclude
的情况下完全可以正常工作。
请注意,我努力只使用System.Runtime.Serialization
属性,因为我试图让我的对象模型不知道序列化程序。
ProtoInclude或等效的,绝对是必需的。如果编译版本发生奇怪的事情,那么这是一个错误,我可以调查。
如果不想向类型添加非 BCL 属性,可以在运行时执行此操作:
RuntimeTypeModel.Default[typeof(BaseType)]
.AddSubClass(.....);
(或像这样的人 - 我不在 PC 上(