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

标签 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;

}

(日期时间有效还是我应该使用 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/

相关文章:

c# - Xamarin - 尝试读取 JSON 时出错

node.js - 在 Nodejs 上使用 protobufjs 使用来自 .net 的 protobuf 消息时出现无效的线路类型和索引超出范围错误

python - 在Python中反序列化Prometheus `remote_write` Protobuf输出

c# - 在 protobuf-net 中序列化 Type 类?

c# - MVC 5 中 @Html.EditorFor(model => model.Name) 中的占位符

c# - 如何获取每个用户的第一行和最后一行数据

ios7 - 使用 xCode 5 编译 protobuf

c# - Protocol Buffer ,让 C# 与 C++ 对话 : type issues and schema issues

c# - 类型不是预期的,并且无法使用 protobuf-net 的 .NET 预定义类推断出任何契约

c# - Azure Function - 写入和读取 blob 文件