Protobuf-net RuntimeTypeModel 不序列化基类的成员



假设我有以下基类:

[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);

我可以看到只有 ClearingSitecode 成员被序列化;基类的 effectiveDatespan 成员的值没有序列化。

两个注意事项:

  1. 我可以看到添加ProtoBuf.Meta.MetaTypeBaseType成员设置为 null ,导致effectiveDatespan成员不序列化; 相反,如果我编译模型,它的BaseType成员被正确设置为 DimensionEntity(尽管它后来失败了,因为成员private readonly,因此无法通过编译的模型访问(;
  2. 当然,我可以将ClearingSite声明为已知类型的DimensionEntity,但我不明白为什么需要这样做:我不是在序列化DimensionEntity,我正在序列化(和反序列化(ClearingSite,此外,如果我正在序列化ClearingSiteDataContractSerializer不需要我向DimensionEntity添加KnownType

从 Marc 的其他答案来看,看起来 Protobuf 需要 KnownType(或 ProtoInclude(属性才能获得"最重要的字段编号"(引用(,但情况似乎并非如此,因为CompiledModel在没有ProtoInclude的情况下完全可以正常工作。

请注意,我努力只使用System.Runtime.Serialization属性,因为我试图让我的对象模型不知道序列化程序。

ProtoInclude或等效的,绝对是必需的。如果编译版本发生奇怪的事情,那么这是一个错误,我可以调查。

如果不想向类型添加非 BCL 属性,可以在运行时执行此操作:

RuntimeTypeModel.Default[typeof(BaseType)]
    .AddSubClass(.....);

(或像这样的人 - 我不在 PC 上(

最新更新