2016-12-11 4 views
1

私はログインが入力された登録フォームを持っています。入力を開始すると、ログインが利用可能かどうかがチェックされるサーバーにテキストがすぐに送信されます。Protobufのデフォルト値

回答は、それ以上のアクションを生成するかどうかに応じて、0または1、真または偽でなければなりません。 0/falseはデフォルトのフィールド値であり、送信されず、フィールドは空のままであり、フィールドはまったくありません(フィールドがデフォルト値と等しくない場合に限り、ワイヤで送信されます)。

どうすればいいですか?私は明示的に0または1の答えを得る必要があります。もちろん、私は文字列を使用しますが、それは何か間違っています。

message InputChecking { 
    string login  = 1; 
    int32 loginStatus = 2; 
    string mail  = 3; 
    int32 mailStatus = 4; 
} 

message RegistrationRequest { 
    ... 
} 

message WrapperMessage { 
    oneof msg { 
     InputChecking mes_inputChecking = 1; 
     RegistrationRequest mes_registrationRequest = 2; 
    } 
} 

た.cpp

WrapperMessage wm; // protobuf message, is filled with data from the server 

const google::protobuf::FieldDescriptor* inputCheckingField = wm.GetDescriptor()->FindFieldByName("mes_inputChecking"); 

if (wm.GetReflection()->HasField(wm, inputCheckingField)) // if inputCheckingField is 
{ 
    // It says that such a field is, when he receives a message from the server with loginStatus = 0, but there are no fields 

    const google::protobuf::FieldDescriptor* loginStatusField = wm.mes_inputchecking().GetDescriptor()->FindFieldByName("loginStatus"); 

    if (wm.mes_inputchecking().GetReflection()->HasField(wm.mes_inputchecking(), loginStatusField)) 
    { 
      // It is only called when the login is different from 0 
      Log("Login status = " + wm.mes_inputchecking().loginstatus()); 
    } 
} 
+1

あなたが望む振る舞いについて正確には分かっていません。 boolが必要な場合は、値がワイヤで送信されているかどうかは関係ありません。受信した値が「送信済み」の値と同じであるだけです。トライステートが必要な場合は、列挙型を使用します。これはproto2かproto3ですか? –

+0

@RichardHodges私は一般的に値0を得ておらず、彼にはフィールドはありません(loginStatusField)。これはproto3です。列挙型を試してみます – Vadim

+0

同じ問題、ListFieldsメソッドは値がデフォルト値と等しい場合はフィールドを返しません https://github.com/google/protobuf/issues/1772 – Vadim

答えて

0

別のオプションは、列挙型を使用することである。

enum LoginStatus { 
    LOGINSTATUS_INVALID = 0, 
    LOGINSTATUS_NOT_AVAILABLE = 1, 
    LOGINSTATUS_AVAILABLE = 2 
} 

これは、コードをより読みやすくなり、そして第3の状態(応答欠落フィールド)が別々に処理されることを可能にする、両方。

0

.proto

私はそれが動作oneofのラッパーで、NULL可能/デフォルトのフィールドを処理する方法を発見しthis threadを読んだ後。

message Foo { 
    int x = 1; 
    oneof v1 { 
    int32 value1 = 2; 
    bool value2 = 3; 
    } 
} 
関連する問題