Protobuf-Net初始化程序异常

时间:2014-08-05 17:08:02

标签: c# protobuf-net

我正在为一个项目使用protobuf-net,并且有一个包含double?[]成员的类。由于某些值可以为null,因此我需要运行以下代码行:

RuntimeTypeModel.Default[typeof(MyType)][1].SupportNull = true;

我将此代码放在类的静态初始化程序中(例如,在static MyType() { ... }中),但是当我运行时,我得到一个带有消息&#34的InvalidOperationException;一旦序列化程序具有该类型,就无法更改已生成"。我怀疑这是因为序列化器是在第一次引用类之前生成的。有没有人知道在哪里放置这行代码,所以它总是在创建序列化器之前运行?

1 个答案:

答案 0 :(得分:0)

啊,我想通了。问题是MyType继承自BaseType。当我去序列化/反序列化从BaseType继承的另一个类型时,所有序列化器都是为从BaseType继承的所有类构建的。然后,稍后第一次引用MyType(它调用静态构造函数),但是已经构建了该类型的序列化器。

为了解决这个问题,我简单地将上述代码行移动到BaseType静态初始化器中。为了澄清,以下说明了我的解决方案:

[ProtoContract]
[ProtoInclude(1, typeof(SubType1))]
[ProtoInclude(2, typeof(SubType2))]
public class BaseType {
    static BaseType() {
        // This runs prior to serializers being built,
        //     regardless of which subtype is used first
        RuntimeTypeModel.Default[typeof(SubType1)][1].SupportNull = true;
    }
    ...
}

[ProtoContract]
public class SubType1 : BaseType {
    [ProtoMember(1, OverwriteList = true)]
    public double?[] MyProp { get; set; }
    ...
}

[ProtoContract]
public class SubType2 : BaseType {
    ...
}