GPBを使用して、ラッパークラスを使用することを停止するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1681263

  •  16-09-2019
  •  | 
  •  

質問

私は使用しています Googleプロトコルバッファー 私のビジネスオブジェクトのいくつかを(Javaアプリで)シリアル化します。チュートリアルで推奨されているように、メッセージビルダーを自分のクラスで包み、GetterとSetterメソッドを実装してメッセージのプロパティにアクセスします。また、すべてのメッセージフィールドを宣言しました optional, 再び彼らの推奨に従ってください。

今、私はエンコードされたメッセージのいずれかをラッパークラスのいずれかに与えることができ、それらは常に解析して受け入れます。これは、実際に含まれていないメッセージタイプを表すラッパーオブジェクトにつながり、多くの偽物が発生します。

メッセージのバイナリコンテンツをラッパークラスにロードするとき、間違ったタイプに合格した場合、エラーをスローするにはどうすればよいですか?

私が現在考えているソリューションでは、すべてのメッセージが必要なタイプフィールド(およびおそらくバージョンフィールド)を備えたベースメッセージを拡張することになります。これにより、生成されたビルダークラスがこれらのフィールドが欠落している場合、例外をスローすることができます。しかし、私はこれが私のコードに対してどのような影響を与えているかをまだ評価していません。これが簡単になるかどうかはわかりません。

役に立ちましたか?

解決 2

これは他の人もしていることのようであり、私にとってはうまくいきます:

message TypedMessage {
    required string type = 1;
    required bytes payload = 2;
}

実際のメッセージは、シリアル化された形式のペイロードフィールドに送られ、タイプは適切なビルダーとラッパークラスを取得するために使用されます。フィールドは列挙である可能性があります。現在、Javaクラス名を使用しています。これは、パーサーの後方互換性をリファクタリングすることを意味するため、後で別のシステムに置き換える可能性があります。

他のヒント

mymessage.parsefrom()に渡すデータがそのタイプのメッセージを表していない場合、無効なprotocolbufferexceptionが得られます。それで十分ではありませんか?

PBメッセージは自己記述的ではないため、(何らかの方法で)どのメッセージを解析しようとしているかを知る必要があります。もちろん、あなたはそれらを解析して無効なプロトコルバッファエクセプションをキャッチしようとすることができますが、それはあまり良くありません。代わりに、ほとんどの人はあなたが説明しているアプローチを使用していると思います。タイプフィールド(通常は列挙)と多くのオプションフィールドを持つベースメッセージクラスを使用します。これにより、メッセージを解析し、メッセージタイプをオンにしてメッセージの実際の「ペイロード」を抽出できます。

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