【问题标题】:Serializing a List of objects using Protobuf-net使用 Protobuf-net 序列化对象列表
【发布时间】:2009-12-07 04:03:58
【问题描述】:

我一直在寻找对文件进行一些二进制序列化,而 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 序列化到文件中并将其读回。任何帮助将不胜感激

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

【问题讨论】:

  • 嗨 Mattias,这里没有任何批评的意思,但我很好奇你为什么会在这里而不是在相当活跃的 Protocol Buffers 论坛上问这个问题:groups.google.com/group/protobuf?pli=1
  • @BillW - 这很好,确定吗?是一道编程题,作者在这里比较活跃,我相信……

标签: c# protocol-buffers protobuf-net


【解决方案1】:

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

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

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

【讨论】:

  • 嗨,马克,感谢您的回答。我想知道的是关于 Post 列表的 .proto 文件声明(而不是属性),然后是如何使用 protogen 和生成的类......还没有看到任何例子,嗯,也许我可以放一个虚拟 Post某个值始终在文件中,如果不存在则回退到上次备份
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多