Google のProtocul Buffersを使用して、既に独自のデータ構造を持つ Java で記述されたサービスがあります。pb を使用してメッセージを配信したいのですが、Java にある既存のデータ構造を pb にシリアル化する方法を探しています。pb のすべてのデータ構造を最初から定義することから始めることができます。これはおそらく正しい方法ですが、怠けすぎます。Java (または他のサポートされている言語) の Person クラス、または数十の属性を持つ Plane クラスがあるとします。そのクラスを pb にシリアル化する方法はありますか? タイプ Plane の pb 属性を持つことはできますか? (Plane が pb でない場合は、Java クラスです)
2 に答える
いいえ、できません。protobuf メッセージのフィールドは、常にプリミティブ (基本的には数値、文字列、およびバイト配列)、protobuf 列挙型 (Java 列挙型として生成される)、または protobuf メッセージです。もちろん、これらすべての反復バージョンです。
リフレクションを使用して Java クラスから .proto ファイルを作成するツールを作成できる可能性がありますが、手動で作成した方が速いと思います。特に、リフレクションを使用した場合は、互換性を維持するために、フィールドが常に同じ名前で生成されるようにする必要があります。できることの1 つは、Java クラスに注釈を付け、それらの注釈に基づいて .proto ファイルを生成するコードを記述することです。あるいは、注釈を使用して proto 形式に直接シリアル化することもできます。個人的には、PB プロジェクトを効果的に書き直すのではなく、何らかの方法で.proto ファイルを作成することをお勧めします。そうしないと、完全にテストされたコードが既に存在する場合にバグが発生する重大なリスクがあります。
注釈システムを作成する場合、Kenton Varda (およびその他の PB コミュニティ) が興味を持ってそれを見たいと思うでしょう。
私が考えることができる 1 つの方法は、protobuf に文字列フィールドを持ち、Java のプリミティブ シリアル化を使用してそのフィールドに Java クラスをシリアル化することです。そうすれば、メッセージの受信者がメッセージの読み取り/逆シリアル化の方法を知っていると仮定すると、Java から Java へのメッセージを簡単にシリアル化できます。
ただし、この手法には欠点があります。いくつか例を挙げると:
- Java to Java のみです (C++、Python などではありません)。
- ネイティブのプロトコル バッファほど効率的ではありません (解析/シリアル化に関しても、メッセージ サイズに関しても)。
- データ構造のロジックがいくつかの場所に散らばっており、一部は protobufs 定義ファイルにあり、一部は他の Java クラスにあり、これにより保守が難しくなります。
しかし、それは短期間で仕事を成し遂げます。