说我有以下基类:
[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
的{{1}}成员被序列化了;基类“ClearingSite
成员的值未序列化。
两个注释:
effectiveDatespan
的{{1}}成员设置为BaseType
,导致ProtoBuf.Meta.MetaType
成员未被序列化;如果我编译模型,而是将其null
成员正确设置为effectiveDatespan
(尽管稍后会失败,因为成员为BaseType
,因此编译模型无法访问; < / LI>
DimensionEntity
声明为private readonly
的已知类型,但我不明白为什么要这样做:我没有序列化ClearingSite
,我是序列化(和反序列化)DimensionEntity
,而DimensionEntity
如果我要序列化ClearingSite
,DataContractSerializer
则不需要我KnownType
添加DimensionEntity
来自Marc的其他答案,看起来Protobuf需要ClearingSite
(或KnownType
)属性才能获得“所有重要的字段编号”(引用),但似乎不是这样,因为ProtoInclude
在没有CompiledModel
的情况下完全正常。
请注意,我正在努力仅使用ProtoInclude
属性,因为我试图让我的对象模型不知道序列化器。
答案 0 :(得分:2)
绝对需要ProtoInclude或同等产品。如果编译版本发生了奇怪的事情,那么这就是一个错误,我可以进行调查。
如果您不想在类型中添加非BCL属性,可以在运行时完成:
RuntimeTypeModel.Default[typeof(BaseType)]
.AddSubClass(.....);
(或者像那样的东西 - 我不是在PC上)