3

假设我有以下基类:

[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成员ClearingSite被序列化了;基类effectiveDatespan成员的值未序列化。

两个注意事项:

  1. 可以看到 add 的BaseType成员ProtoBuf.Meta.MetaType设置为null,导致effectiveDatespan成员没有被序列化;相反,如果我编译模型,则它的BaseType成员被正确设置为DimensionEntity(尽管它稍后会失败,因为成员是这样的private readonly,因此编译模型无法访问);
  2. 当然,我可以声明ClearingSite为 的已知类型DimensionEntity,但我不明白为什么需要这样做:我没有序列化 a DimensionEntity,我正在序列化(和反序列化) a ClearingSite,而且DataContractSerializer不需要我添加如果我正在序列化KnownType一个.DimensionEntityClearingSite

从 Marc 的其他答案来看,Protobuf 似乎需要KnownType(or ProtoInclude) 属性才能获得“所有重要的字段编号”(引用),但情况似乎并非如此,因为CompiledModel没有ProtoInclude.

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

4

1 回答 1

2

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

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

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

(或类似的东西-我不在PC上)

于 2012-05-01T17:31:38.037 回答