2012-10-04 27 views
0

我們使用協議緩衝區將數據存儲在數據庫中(作爲blob)。在某個時候,我們再次閱讀它們,需要修改它們並再次存儲它們。將Google協議緩衝區消息的結構複製到構建器對象的結構中

問題是,協議緩衝區消息對象是不可變的。我們想到的僅僅是使用協議緩衝區信息作爲原型創建一個新的構建器對象:

Foo.Builder.newBuilder(prototype) 

這基本上可行。但是因爲我們有一個嵌套結構,所以原型對象實際上包含屬性,它們本身就是消息,這是行不通的。摘自the documentation

由於嵌入式消息和字符串對象是不可變的,它們在原始文件和副本之間共享。

有沒有辦法將整個結構克隆到可變的新建設者對象?

回答

1

嗯,有點。我已經使用DynamicMessage.Builder,Descriptor和FieldDescriptor完成了這個工作。我遞歸地使用一個完全限定的名字來遍歷我想要更新的屬性的對象圖。一旦找到,我會更新它,並在DyynamicMessage.Builder上調用構建備份堆棧。這並不是直截了當,特別是在處理重複的領域時。

相關問題