我正在为一个项目使用protobuf-net,并且有一个包含double?[]成员的类。由于某些值可以为null,因此我需要运行以下代码行:
RuntimeTypeModel.Default[typeof(MyType)][1].SupportNull = true;
我将此代码放在类的静态初始化程序中(例如,在static MyType() { ... }
中),但是当我运行时,我得到一个带有消息&#34的InvalidOperationException;一旦序列化程序具有该类型,就无法更改已生成"。我怀疑这是因为序列化器是在第一次引用类之前生成的。有没有人知道在哪里放置这行代码,所以它总是在创建序列化器之前运行?
答案 0 :(得分:0)
为了解决这个问题,我简单地将上述代码行移动到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 {
...
}