【发布时间】:2015-09-06 10:46:22
【问题描述】:
我们已经使用 protobuf 好几年了,它非常适合我们的工作。
但是,最近我们遇到了一些反序列化问题。
以前反序列化是串行完成的,现在为了加快我们使用系统可以提供的所有内核的过程。
场景:
- 我们正在生成报告,其中包括 100 张图像。
- 每个图像都是一个小部件,每个小部件都有自己的数据源。
- 我们有不止一个小部件访问相同的数据(存储在 protobuf 中)。
- 附件是一个屏幕截图,其中突出显示了 2 个开始反序列化的小部件。
- 其中第一个已成功反序列化。
- 第二个反序列化失败,并附有以下错误消息
注意:第一次和第二次反序列化相隔几毫秒。
错误:
上下文:1 错误生成小部件。分析任务全局 ID: d549f367-f42f-45fa-b230-f2839a6fefe6 错误:类型异常 'ProtoBuf.ProtoException' 被抛出。堆栈:在 ProtoBuf.ProtoReader.StartSubItem(ProtoReader reader) in c:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:第 599 行 ProtoBuf.ProtoReader.ReadTypedObject(对象值,Int32 键, ProtoReader 阅读器,Type 类型)在 c:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:line 531 at proto_2(对象,ProtoReader)在 ProtoBuf.Meta.TypeModel.Deserialize(流源,对象值,类型 类型,SerializationContext 上下文)在 c:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:第 506 行 ProtoBuf.Serializer.Deserialize[T](Stream source) in c:\Dev\protobuf-net\protobuf-net\Serializer.cs:第 69 行
我们认为这不是多线程问题!因为我们尝试同步反序列化过程。
但是,在反序列化之前添加 1000 毫秒的睡眠时,大部分时间都有效!
对此有任何想法,请告诉我。
【问题讨论】:
-
我们使用的是版本 2 的 protobuf
-
我们反序列化的类型有 113000 字节。看起来对象的大小和多线程的使用导致了这个问题。是否有任何 protobuf 提示,我应该使用?
-
如果您将堆栈跟踪格式化为更易于阅读,这将更容易理解您的问题。
标签: .net protobuf-net