Protobuf:如何重写文件

Protobuf: how to rewrite a file

我使用 Protobuf3 作为文件格式。 PB API 非常适合序列化和反序列化。但是我现在想做一个往返:写一个文件,读回它,修改一个字段并将文件重写回存储。

更详细一点:在创建PB对象时,首先实例化一个Builder对象,设置对象中的字段值,然后构建二进制对象。但是,在写入和读回二进制对象之后,如何修改字段呢?必须使用 Builder 对象来生成二进制文件,但是否必须将所有现有字段复制回 Builder 中?还是 Builder 会自动从二进制形式填充自身?

理想情况下,我可以加载二进制文件,创建一个新的构建器,设置我想要的字段,并期望将原始数据和新数据合并在一起。

什么是最佳做法?

当您反序列化时,您最终会得到一个设置了字段的对象。您可以按照自己喜欢的方式修改这些字段。然后您可以序列化该对象并将新的字节流写入文件。

您不需要制作反序列化对象的副本来执行此操作(但是,如果您希望制作副本,GPB 实现通常具有复制构造函数)。

您不能做的是就地编辑文件;你必须完全重写文件。您没有明智的方法来了解字节流的哪一部分发生了变化。它可能变得更长、更短,并且内容本身在任何情况下都会有所不同(因为您已经更改了对象中的字段)。