Protobuf.net“生成序列化程序后无法更改类型”

时间:2010-10-23 22:00:15

标签: c# .net debugging protobuf-net

我有一些使用Protobuf.net的相当简单的代码,这是一个非常奇怪的例外。 在第167行的MetaType.cs中,它抛出InvalidOperationException“生成序列化程序后无法更改类型”。这是什么意思,我该如何解决?

我的代码如下所示:

此方法启动所有序列化:

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

    SerialiseWidget(w);

}).IsCompleted)
{
    Thread.Sleep(10);
}

非常简单,它只是在Parallel中循环遍历所有内容,并串行化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;
}

编辑::我怀疑这可能与我并行循环的事实有关。那种线程是如何保护Protobuf.net的呢?

1 个答案:

答案 0 :(得分:4)

  

Threadobuf.net的线程安全是怎么回事?

嗯,它发现了一些奇怪的事情:)

只需在theading之前的某个时刻添加对Serializer.PrepareSerializer的调用(应用程序启动是明显的一点),它应该原谅你......

编辑:考虑一下,我可以做一个相当简单的改变来帮助这个特定的场景;当我有机会时,我会调整一下。此外,这应该只影响未发布的“v2”代码(来自代码) - 预构建的dll不受此AFAIK的影响。