11

これは私のprotoファイルです:

message MSG {

  required MsgCodes MsgCode = 1;
  optional int64 Serial = 2;        // Unique ID number for this person.
  required int32 From = 3;  
  required int32 To = 4;  
  //bla bla...
        enum MsgCodes
        {
            MSG = 1;
            FILE = 2;
            APPROVE=4;
            ACK=8;
            ERROR_SENDING=16;
            WORLD=32;
        }
}

私のC#では、次のことを試みています:

 msg = msg.ToBuilder().SetMsgCode(msg.MsgCode | MSG.Types.MsgCodes.ACK | MSG.Types.MsgCodes.APPROVE).Build();
 SendToJava(msg);

しかし、JAVAは私に教えてくれます:MsgCodeがありません(これはですrequired

組み合わせを削除する -それを解決します

しかし、組み合わせを指定する必要があります

質問

どうすれば解決できますか?

注意:

奇妙なことに、msg複数の enum を作成して設定し、それを C# で再度読み取ると、動作します...:-(

4

5 に答える 5

13

Protobufs では、列挙型フィールドは、列挙型で指定された正確な数値の 1 つだけを持つことができます。つまり、列挙型フィールドをビットフィールドとして使用することはできません。ビットフィールドが必要な場合は、 のような整数型を使用する必要がありますint32。このルールは実際には、C++ のような数値の列挙型を持つ言語にも適用されます。ワイヤから読み取られた列挙型の protobuf フィールドに無効な値がある場合、そのフィールドは不明なフィールドとして扱われ、非表示になります。

整数に切り替えると、もちろん、フラグ値を宣言する方法の問題が発生します。残念ながら、Protobufs は定数を定義する適切な方法を提供しません。自己回答で提案したように、ダミーの列挙型定義をハックとして使用できますが、数値は必ずしもすべての言語で利用できるわけではないことに注意してください。C++ と Python は数値の列挙型を使用するため (どうやら C# も?)、動作します。Java では、Protobuf 列挙型.getNumber()に、数値を取得するために使用できるメソッドがあります。それ以外の場合、通常の Java 列挙型は数値ではありません。

(余談ですが、私は Google のオープン ソース Protobuf コードのほとんどの作成者です。また、 Protobuf の置き換えを目的とした新しい Google 以外のプロジェクトであるCap'n Protoの作成者でもあります。他の利点の中でも、Cap'n Proto は定義をサポートしています。スキーマ ファイルの定数. しかし、これを書いている時点では、C# のサポートはまだ準備ができていません (ただし、作業中です!)。

于 2014-11-08T22:25:45.587 に答える
6

私は解決策を見つけました(一種の)

int ホルダーが必要です。

message Foo {
  enum Flags {
    FLAG1 = 0x01;
    FLAG2 = 0x02;
    FLAG3 = 0x04;
  }

  // Bitwise-OR of Flags.
  optional uint32 flags = 1;
  • うーん、それが唯一の解決策ですか?
于 2014-11-07T21:57:42.407 に答える
1

フィールドを整数として定義します。

required int32 MsgCode = 1;

.proto ファイルでは何も参照されませんが、質問のように列挙型を定義します。

コードで enum フィールドを使用します。C# では、あなたの例に似ています (ただし、使用するライブラリによって異なります。たとえば、protobuf-netは優れており、軽量の Enum.Field 構文を備えています)。Java では、フィールドに_VALUE接尾辞を付けて使用します (例: MsgCodes.APPROVE_VALUE.

于 2015-08-18T20:52:42.417 に答える