代码之家  ›  专栏  ›  技术社区  ›  Martin

Protobuf.net“一旦生成序列化程序,就不能更改类型”

  •  2
  • Martin  · 技术社区  · 14 年前

    我有一些使用Protobuf.net的相当简单的代码,它抛出了一个非常奇怪的异常。 在第167行的MetaType.cs中,它抛出invalidooperationexception“一旦生成序列化程序,就不能更改类型”。这是什么意思?我该怎么解决?

    我的代码如下:

    while (!Parallel.For(0, 100, (i) =>
    {
        Widget w;
        lock (f) { w = f.CreateWidget(); }
    
        SerialiseWidget(w);
    
    }).IsCompleted)
    {
        Thread.Sleep(10);
    }
    

    很简单,它只是并行循环所有内容,并序列化100个小部件。

    private byte[] SerialiseWidget(Widget w)
    {
        using (MemoryStream m = new MemoryStream())
        {
            Serializer.Serialize<PacketChunk>(m, w);
    
            return m.ToArray();
        }
    }
    

    最后,widget类如下所示:

    [ProtoContract]
    private class Widget
    {
        [ProtoMember(1)]
        public int a;
    
        [ProtoMember(2)]
        public byte[] b;
    
        [ProtoMember(3)]
        public Thing c; //Thing is itself a protocontract
    
        [ProtoMember(4)]
        public int d;
    
        [ProtoMember(5)]
        public int e;
    }
    

    1 回复  |  直到 14 年前
        1
  •  4
  •   Marc Gravell    14 年前

    Protobuf.net对于这种东西来说有多安全?

    嗯,它注意到了一些奇怪的事情:)

    只需在主题开始前的某个时刻添加对Serializer.prepareseriaizer的调用(应用程序启动是显而易见的一点),它应该会原谅你。。。

    编辑:考虑一下,我可以做一个相当简单的更改来帮助特定的场景;我会在有机会的时候调整它。而且,这只会影响 未发行