2011-12-30 2 views
3

アプリケーションAはアプリケーションBがファイルの次のバージョンを使用し必須ではあるが範囲外であれば列挙型の値は何ですか?

message The_message 
{ 
    enum The_enum 
    { 
     one = 1; 
     two = 2; 
    } 

    required The_enum the_enum = 1; 
} 

このプロト・ファイルを使用します。それは、アプリケーションBがthree列挙型を使用したアプリケーションAにメッセージを送信した場合どうなりますか1つの以上enumフィールド

three = 3; 

を持っていることを除いて類似しているのですか?

protobuf documentationは、さまざまな価値を提供しようとした場合

は、パーサは未知の分野

ので列挙threeが未知のフィールドになりように扱うだろうと言います。 the_enumがオプションの場合は問題ありませんが、必須フィールドです。
アプリケーションAはメッセージを正しく解析できますか?
列挙型はこのように拡張するつもりはありませんか?

+2

答えはC#とC++の間で異なる可能性がありますが、Javaについてはわかりません。 –

+0

Javaではおそらく 'null'です。enumは本物のオブジェクトです。 (決してプロトコルバッファを使用しませんでした。) –

+0

試しましたか?ドキュメントは不明ですので、私はそれを "自分で試して何が起こるか見る"と考えていますが、それは以下の@ StephenCの答えにつながる可能性があります。 –

答えて

3

私はそれがrequiredフィールドが欠落されたメッセージに遭遇したかのようにパーサが同じように動作することを期待したいです。パーサがメッセージを拒否すると思います。

あなたがこれを言うためにリンクされたページ:

必須フォーエバーです - あなたは、必要に応じてフィールドをマークについて非常に注意しなければなりません。書いたり、必要なフィールドを送信したくない場合は、フィールドをオプションのフィールドに変更するのが問題になります。古い読者は、このフィールドのないメッセージを不完全なものと見なして意図せずに拒否または破棄することがあります。

これはまさにあなたが話しているシナリオではありませんが、必要なメッセージがないとメッセージが受け入れられないことを意味します。


列挙型指定されたフィールドがrequiredなかった場合は、ドキュメントにはフィールドが不明なフィールドとして扱われることを意味しています。サポートしているprotobuf APIのバージョンを使用していた場合は、このフィールドと値にアクセスできますが、マッピングされたJavaまたはC#enumタイプではなく、バイトなどと見なされます。

関連する問題