2012-10-04 24 views
0

我们使用协议缓冲区将数据存储在数据库中(作为blob)。在某个时候,我们再次阅读它们,需要修改它们并再次存储它们。将Google协议缓冲区消息的结构复制到构建器对象的结构中

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

Foo.Builder.newBuilder(prototype) 

这基本上可行。但是因为我们有一个嵌套结构,所以原型对象实际上包含属性,它们本身就是消息,这是行不通的。摘自the documentation

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

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

回答

1

嗯,有点。我已经使用DynamicMessage.Builder,Descriptor和FieldDescriptor完成了这个工作。我递归地使用一个完全限定的名字来遍历我想要更新的属性的对象图。一旦找到,我会更新它,并在DyynamicMessage.Builder上调用构建备份堆栈。这并不是直截了当,特别是在处理重复的领域时。

相关问题