0

Google Protocol Buffersを使用して、ビジネス オブジェクトの一部を (Java アプリで) シリアル化しています。チュートリアルで推奨されているように、メッセージのプロパティにアクセスするためのゲッター メソッドとセッター メソッドを実装する独自のクラスにメッセージ ビルダーをラップします。また、すべてのメッセージ フィールドを宣言しましたがoptional、ここでも推奨事項に従っています。

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

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

私が現在考えている解決策は、すべてのメッセージが必要なタイプ フィールド (およびおそらくバージョン フィールド) を持つ基本メッセージを拡張することです。これにより、これらのフィールドが欠落している場合、生成されたビルダー クラスが例外をスローし、それらが存在する場合は、自分のコードをチェックインできます。ただし、これが私のコードにどのような影響を与えるかの評価はまだ完了しておらず、これが簡単になるかどうかもわかりません。

4

2 に答える 2

1

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

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

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

于 2009-11-06T16:03:02.803 に答える