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

时间:2012-05-01 16:06:56

标签: protobuf-net

说我有以下基类:

[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成员的值未序列化。

两个注释:

  1. 我可以看到添加的effectiveDatespan的{​​{1}}成员设置为BaseType,导致ProtoBuf.Meta.MetaType成员未被序列化;如果我编译模型,而是将其null成员正确设置为effectiveDatespan(尽管稍后会失败,因为成员为BaseType,因此编译模型无法访问; < / LI>
  2. 当然我可以将DimensionEntity声明为private readonly的已知类型,但我不明白为什么要这样做:我没有序列化ClearingSite,我是序列化(和反序列化)DimensionEntity,而DimensionEntity如果我要序列化ClearingSiteDataContractSerializer则不需要我KnownType添加DimensionEntity
  3. 来自Marc的其他答案,看起来Protobuf需要ClearingSite(或KnownType)属性才能获得“所有重要的字段编号”(引用),但似乎不是这样,因为ProtoInclude在没有CompiledModel的情况下完全正常。

    请注意,我正在努力仅使用ProtoInclude属性,因为我试图让我的对象模型不知道序列化器。

1 个答案:

答案 0 :(得分:2)

绝对需要ProtoInclude或同等产品。如果编译版本发生了奇怪的事情,那么这就是一个错误,我可以进行调查。

如果您不想在类型中添加非BCL属性,可以在运行时完成:

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

(或者像那样的东西 - 我不是在PC上)