Protobuf-net 错误 - 序列化设置为 null 的固定数组
Posted
技术标签:
【中文标题】Protobuf-net 错误 - 序列化设置为 null 的固定数组【英文标题】:Protobuf-net bug - serializing fixed array that is set to null 【发布时间】:2011-06-02 11:50:04 【问题描述】:我正在使用 protobuf-net 库来序列化一些对象。我有一个字段
[ProtoMember(3, DataFormat = DataFormat.FixedSize, IsPacked = true)]
ushort[] foo;
当我将其设置为 ushort[] 3
然后序列化整个对象并将其读回时,这很好。然后,当我将 foo 设置为空数组或 null 并序列化并再次读取它时,它不会被删除。我最终得到了包含 3 的数组。为了确保不是文件系统问题,我更改了其他属性并进行了往返,它们都按预期运行。
有谁知道这是实现中的错误还是功能?
【问题讨论】:
您使用的是哪个版本的 protobuf-net,您有示例我可以查看一下您的意思吗? 【参考方案1】:完全没有可重现的例子,但 IMO 最有可能的答案是您正在覆盖输出流(例如文件)而不截断它。因为 protobuf 规范不包括 root 对象的终止符(等),所以它会读取到文件的末尾。如果然后用较少的数据覆盖,则任何未截断的内容都是垃圾。
现在,如果更改意味着最后的垃圾不会解析为 protobuf,you'll get an exception, like this。但是,如果数据仍然有效(例如,foo
是流中的最后一项),那么它只会读取并处理它。特别是,设置集合会导致该项目未被写入,因此为什么将其设置为 null 仍然会留下有效的流(如果它是要序列化的最终字段)。
如果您还没有这样做,请确保修剪输出(上面链接的帖子中显示了两种简单的方法)。
如果这无关紧要,那么我道歉 - 但没有更多信息/可重复的示例,我不得不使用一些猜测;p
【讨论】:
是的,就是这样。我不知道截断问题。谢谢。 @jz87 是的,在处理(和覆盖)流时这是一个内置问题;它不是特定于 protobuf-net以上是关于Protobuf-net 错误 - 序列化设置为 null 的固定数组的主要内容,如果未能解决你的问题,请参考以下文章
对象(通用)的 Protobuf-net 序列化抛出错误没有为类型定义序列化程序:System.Object
protobuf-net 不使用私有设置器序列化 C# 属性