Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Protobuf.net“一旦生成序列化程序,就无法更改类型”_C#_.net_Debugging_Protobuf Net - Fatal编程技术网

C# Protobuf.net“一旦生成序列化程序,就无法更改类型”

C# Protobuf.net“一旦生成序列化程序,就无法更改类型”,c#,.net,debugging,protobuf-net,C#,.net,Debugging,Protobuf Net,我有一些使用Protobuf.net的相当简单的代码,它抛出了一个非常奇怪的异常。 在第167行的MetaType.cs中,它抛出InvalidOperationException。一旦生成序列化程序,就无法更改该类型。这意味着什么?我如何修复它 我的代码如下所示: [ProtoContract] private class Widget { [ProtoMember(1)] public int a; [ProtoMember(2)] public byte[

我有一些使用Protobuf.net的相当简单的代码,它抛出了一个非常奇怪的异常。 在第167行的MetaType.cs中,它抛出InvalidOperationException。一旦生成序列化程序,就无法更改该类型。这意味着什么?我如何修复它

我的代码如下所示:

[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;
}
此方法启动所有序列化操作:

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();
    }
}
编辑::我怀疑这可能与我并行循环的事实有关。Protobuf.net在这种情况下的线程安全性如何

Protobuf.net在这种情况下的线程安全性如何

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

只需在加载应用程序启动之前的某个时间点添加对Serializer.PrepareSerializer的调用,它就会原谅您


编辑:想一想,我可以做一个相当简单的更改来帮助特定场景;有机会的话我会调整的。此外,这只会影响sorce代码中未发布的v2代码-预构建的dll不受此AFAIK的影响。

非常好,调用PrepareSerializer方法有效。谢谢你的快速回复Marc:D