0

我们使用协议缓冲区将数据存储在数据库中(作为 blob)。在某些时候,我们再次阅读它们,需要修改它们并再次存储它们。

问题是,协议缓冲区消息对象是不可变的。我们想到的只是使用协议缓冲区消息作为原型创建一个新的构建器对象:

Foo.Builder.newBuilder(prototype)

这基本上有效。但是由于我们有一个嵌套结构,所以原型对象实际上包含属性本身就是消息,这是行不通的。文档摘录:

由于嵌入的消息和字符串对象是不可变的,它们在原始和副本之间共享。

有没有办法将整个结构克隆到可变的新构建器对象?

4

1 回答 1

1

嗯,有点。我已经使用 DynamicMessage.Builder、Descriptor 和 FieldDescriptor 完成了这项工作。我使用完全限定名称递归地将对象图遍历到要更新的属性。一旦找到,我更新它并在 DynamicMessage.Builder(s) 上调用 build 备份堆栈。特别是在处理重复字段时,这并不简单。

于 2012-10-04T17:24:57.807 回答