C# Protobuf.net“一旦生成序列化程序,就无法更改类型”
我有一些使用Protobuf.net的相当简单的代码,它抛出了一个非常奇怪的异常。 在第167行的MetaType.cs中,它抛出InvalidOperationException。一旦生成序列化程序,就无法更改该类型。这意味着什么?我如何修复它 我的代码如下所示: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[
[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