我有一些使用 Protobuf.net 的相当简单的代码,它抛出了一个非常奇怪的异常。
在 MetaType.cs 的第 167 行中,它抛出 InvalidOperationException“一旦生成序列化程序,就无法更改类型”。这是什么意思以及如何解决它?
我的代码如下所示:
此方法开始所有序列化:
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();
}
}
最后,小部件类如下所示:
[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 的线程安全性如何?
对于此类事情,Protobuf.net 的线程安全性如何?
好吧,它注意到发生了一些奇怪的事情:)
只需在线程之前的某个时刻添加对 Serializer.Prepare Serializer 的调用(应用程序启动是显而易见的点),它应该会原谅您......
编辑:想一想,我可以做一个相当简单的改变来帮助特定的场景;当我有机会时我会调整它。此外,这应该只会影响未发布“v2”代码(来自源代码)- 预构建的 dll 不受此 AFAIK 的影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)