0

データベースにデータを (blob として) 格納するために、プロトコル バッファを使用します。ある時点で、それらを再度読み取り、変更して再度保存する必要があります。

問題は、プロトコル バッファ メッセージ オブジェクトが不変であることです。私たちが念頭に置いていたのは、プロトコル バッファ メッセージをプロトタイプとして使用して、新しいビルダー オブジェクトを作成することだけでした。

Foo.Builder.newBuilder(prototype)

これは基本的に機能します。しかし、ネストされた構造があるため、プロトタイプ オブジェクトには実際にはメッセージ自体である属性が含まれているため、これは機能しません。ドキュメントからの抜粋:

埋め込まれたメッセージと文字列オブジェクトは不変であるため、オリジナルとコピーの間で共有されます。

変更可能な新しいビルダー オブジェクトに構造全体を複製する方法はありますか?

4

1 に答える 1

1

そうですね。DynamicMessage.Builder、Descriptor、および FieldDescriptor を使用してこれを行いました。更新するプロパティの完全修飾名を使用して、オブジェクト グラフを再帰的にウォークします。見つかったら、それを更新し、DynamicMessage.Builder で build を呼び出してスタックをバックアップします。特に繰り返しフィールドを扱う場合は簡単ではありません。

于 2012-10-04T17:24:57.807 に答える