我一直在寻求对文件进行一些二进制序列化,而 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;
}
(日期时间有效还是我应该使用 ticks 作为 int64?)
但我一直在研究如何使用 protogen 然后将 Post 的 IEnumerable 序列化到文件并读回。任何帮助将不胜感激
另一个相关问题,是否有任何检测损坏的二进制文件的最佳实践,例如在序列化时是否关闭计算机
最佳答案
回复 DateTime
...这不是标准原型(prototype);我在自己的库中添加了一个 BCL.DateTime(或类似的),目的是匹配 protobuf-net 用于 DateTime
的内部序列化。 ,但我相当确定我还没有(还)更新代码生成器以将其检测为特例。如果你想让我试试,添加起来会相当容易......如果你想要最大的可移植性,“滴答”风格的方法可能是务实的。让我知道...
重新序列化到一个文件 - 如果应该与 Getting Started 大致相同例如,但请注意 protobuf-net 想要处理它可以重建的数据; 只是 IEnumerable<T>
可能会导致问题 - IList<T>
不过应该没问题(重建时默认为 List<T>
作为具体类型)。
重新腐败——也许使用SerializeWithLengthPrefix
- 然后它甚至可以在消息边界检测问题(否则它们无法检测为 EOF)。这(顾名思义)首先写入长度,因此它知道是否有足够的数据(通过 DeserializeWithLengthPrefix
)。或者,为哈希/校验和保留文件中的前 [n] 个字节。写这个空格,然后是数据,计算散列/校验和并覆盖开始。在反序列化期间验证。更多工作。
关于c# - 使用 Protobuf-net 序列化对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1857740/