【问题标题】:Protobuf-Net Initializer ExceptionProtobuf-Net 初始化程序异常
【发布时间】:2014-08-06 03:01:34
【问题描述】:

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

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

我将此代码放在类的静态初始化程序中(例如,在static MyType() { ... } 中),但是当我运行时,我收到 InvalidOperationException 并显示消息“一旦生成序列化程序就无法更改类型”。我怀疑这是由于在第一次引用类之前生成了序列化程序。有谁知道将这行代码放在哪里,以便它始终在创建序列化程序之前运行?

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    啊,我想通了。问题是 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 {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      相关资源
      最近更新 更多