Protobuf-net 错误 - 序列化设置为 null 的固定数组

标签 protobuf-net

我正在使用 protobuf-net 库来序列化一些对象。我有一个领域

[ProtoMember(3, DataFormat = DataFormat.FixedSize, IsPacked = true)]
ushort[] foo;

当我将它设置为说 ushort[] { 3 } 然后序列化整个对象并将其读回时,一切正常。然后,当我将 foo 设置为空数组或 null 并序列化并再次读回时,它不会被删除。我最终得到了其中包含 3 的数组。为了确保这不是某些文件系统问题,我更改了其他属性并进行了往返,它们都按预期运行。

有谁知道这是实现中的错误还是功能?

最佳答案

如果没有可重现的示例,它不是完全清楚的,但 IMO 最有可能的答案是您正在覆盖输出流(例如文件)而不截断它。因为 protobuf 规范不包括 root 对象的终止符(等),它会读取到文件末尾。如果您随后用较少的数据覆盖,则任何未被截断的内容都是垃圾。

现在,如果更改意味着末尾的垃圾不解析为 protobuf,you'll get an exception, like this .但是,如果数据仍然有效(因为,例如 foo 是流中的最后一项),那么它只会读取并处理它。特别是,设置集合会导致该项目不被写入,因此为什么将其设置为 null 仍然会留下有效流(如果它是要序列化的最终字段)。

如果您还没有这样做,请确保修剪您的输出(上面链接的帖子中显示了执行此操作的 2 种简单方法)。

如果这无关紧要,那么我深表歉意 - 但在没有更多信息/可重现示例的情况下,我不得不进行一些猜测;p

关于Protobuf-net 错误 - 序列化设置为 null 的固定数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6214143/

相关文章:

Protobuf-net:使用 Stream 数据成员序列化第 3 方类

c# confluence.kafka 无法使用 Protobuf-net 反序列化 protobuf 消息

deserialization - protobuf-net 的大文件反序列化

c# - Protobuf-net 使用接口(interface)和抽象基类创建类型模型

c# - 使用 Protobuf-net 和 Monotouch for IOS 通过 WCF 序列化 IEnumerable

c# - 使用 ProtoBuff.Net 通过 Socket 接收多种类型的对象

c# - 使用 protobuf-net 序列化基类属性

c# - WP7 中的 Protobuf-net 抛出 FieldAccessExceptions

protobuf-net - 使用 protobuf-net 反序列化集合

protobuf-net - 使用递归引用理解 ProtoBuf-Net AsReference