質問

googleのプロトコルバッファを使用すると、Javaで記述されたサービスが既にあります。既にデータ構造を所有しています。メッセージを配信するためにpbを使用したいのですが、Javaにある既存のデータ構造をpbにシリアル化する方法を探しています。 pbのすべてのデータ構造をゼロから定義することから始めることができます。これはおそらく正しい方法ですが、あまりにも面倒です。 だから、Java(または他のサポートされている言語)のPersonクラスまたは数十の属性を持つPlaneクラスがあるとしたら、そのクラスをpbにシリアル化する方法はありますか?タイプPlaneのpb属性を使用できますか? (プレーンがpbでない場合、それはJavaクラスです)

役に立ちましたか?

解決

いいえ、できません。 protobufメッセージのフィールドは常にプリミティブ(基本的には数値、文字列、バイト配列)、protobuf列挙(Java列挙として生成される)、またはprotobufメッセージです-もちろん、これらすべての繰り返しバージョンです。

リフレクションを使用してJavaクラスから.protoファイルを作成するツールを作成することもできますが、手作業で行う方が簡単だと思います。特に、リフレクションを使用する 場合、互換性を維持するために、フィールドが常に同じ名前で生成されるようにする必要があります。 Javaクラスに注釈を付けて、それらの注釈に基づいて.protoファイルを生成するコードを記述するか、注釈を使用してプロトタイプ形式に直接シリアル化することもできます。個人的には、PBプロジェクトを効果的に書き換えるのではなく、 some の方法で.protoファイルを作成することをお勧めします。

注釈システムを行う場合、Kenton Varda(およびその他のPBコミュニティ)はそれを見ることに興味があると確信しています。

他のヒント

考えられる1つの方法は、protobufに文字列フィールドを用意し、Javaのプリミティブシリアル化を使用してJavaクラスをそのフィールドにシリアル化することです。そうすれば、メッセージの受信者がメッセージの読み取り/逆シリアル化の方法を知っていると仮定すると、JavaからJavaへのメッセージを簡単にシリアル化できます。

ただし、この手法には欠点があります。いくつか例を挙げます:

  1. これはJavaからJavaのみです(C ++、Pythonなどはありません)
  2. ネイティブのprotobufほど効率的ではありません(構文解析/シリアライズもメッセージサイズも)
  3. いくつかの場所に散在するデータ構造のロジックがあります。一部はprotobufs定義ファイルにあり、一部は他のJavaクラスにあり、これにより物事の管理が難しくなります。

しかし-それは短期的に仕事を済ませます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top