3

我一直在寻找对文件进行一些二进制序列化,而 protobuf-net 似乎是一个性能良好的替代方案。不过,我有点卡在入门上。由于我想将类的定义与实际的序列化分离,因此我没有使用属性,而是选择使用 .proto 文件,因此我已经将对象的结构降低了(我认为)

message Post {

  required uint64 id = 1;

  required int32 userid = 2;

  required string status= 3;

  required datetime created = 4;

  optional string source= 5;

}

(日期时间有效还是应该使用刻度作为 int64?)

但我一直坚持如何使用 protogen,然后将 IEnumerable 的 Post 序列化到文件中并将其读回。任何帮助,将不胜感激

另一个相关问题,是否有检测损坏的二进制文件的最佳实践,例如在序列化时计算机是否关闭

4

1 回答 1

2

Re DateTime...这不是标准原型;我已经在我自己的库中添加了一个 BCL.DateTime (或类似的),它旨在匹配 protobuf-net 用于的内部序列化DateTime,但我相当确定我还没有(还)将代码生成器更新为将此检测为特例。如果您希望我尝试添加它会相当容易......如果您想要最大的可移植性,“滴答”风格的方法可能是实用的。让我知道...

重新序列化到文件 - 如果应该与入门示例大致相同,但请注意 protobuf-net 希望使用它可以重建的数据;只是 IEnumerable<T>可能会导致问题 -IList<T>不过应该没问题(List<T>重建时它会默认为具体类型)。

重新损坏 - 也许使用SerializeWithLengthPrefix- 然后它甚至可以在消息边界处检测问题(否则它们无法作为 EOF 检测到)。这(顾名思义)首先写入长度,因此它知道是否有足够的数据(通过DeserializeWithLengthPrefix)。或者,将文件中的前 [n] 个字节保留为哈希/校验和。写这个空格,然后是数据,计算哈希/校验和并覆盖开始。在反序列化期间验证。更多的工作。

于 2009-12-07T07:34:03.000 回答