使用Protobuf-net序列化对象列表

时间:2009-12-07 04:03:58

标签: c# protocol-buffers protobuf-net

我一直在寻找一些二进制序列化文件和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序列化为一个文件并将其读回来。任何帮助将不胜感激

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

1 个答案:

答案 0 :(得分:2)

重新DateTime ...此不是标准原型;我已将BCL.DateTime(或类似)添加到我自己的库中,该库旨在匹配protobuf-net用于DateTime的内部序列化,但我相当确定我还没有(更新)更新代码生成器将其检测为特例。如果你想让我尝试的话,添加起来相当容易......如果你想要最大程度的可移植性,那么“滴答”风格的方法可能是务实的。让我知道......

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

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