2017-01-11 1 views
0

私はGoogle Protobuf 3.0.0を使用しています。 ZeroMQを使用してサーバーと一部のクライアント間の接続を実現します。だから、私のプロト・ファイルは次のようになります。あなたが見ることができるようにGoogleプロトコルバッファー3.0 - シリアル化された長さは0ですset_field(...)の後

// message Request{} omitted 
message Response{ 
enum MessageType{ 
    Type1 = 0; 
    Type2 = 1; 
    Type3 = 2; 
} 
enum ConfirmationCode{ 
    OK = 0; 
    Error1 = 1; 
    Error2 = 2; 
} 
MessageType Type = 1; 
repeated someField1 field1 = 2; 
// ... some code omitted 
ConfirmationCode Confirm = 3; 
} 

、いるProtobuf 3であり、もはやrequiredまたはoptionalフィールドではないと私は任意のデフォルト値を使用していません。 ProtobufメッセージをシリアライズしてZMQで送信しようとすると、いくつかの問題が発生しました。 google::protobuf::message_lite::SerializeToString(...)によって行わ直列化は失敗しませんが、それでも、この方法とgoogle::protobuf::message_lite::SerializeAsString()は、空の文字列を生成するので、私は、シリアル化の前に多分単一のフィールドが、私応じて設定されたていないことを考えて、私は次のよう

void InitResponse(Response& resp) 
{ 
    resp.set_confirm(Response_ConfirmationCode_OK); 
    resp.set_type(Response_MessageType_Type1); 
} 
と同様の方法を紹介しました

少なくともいくつかのフィールドが存在することを確認してください。それでも、このメソッドを呼び出す前後に、私のシリアル化された応答の長さは0です。私はまたgoogle::protobuf::Message::DebugString()を使ってみましたが、私は空の文字列を印刷してしまうので、このメソッドはすべてのフィールドを表示しません。

シリアル化が失敗しないと、シリアル化されたメッセージが空になるのはなぜですか?列挙型の場合

答えて

1

https://developers.google.com/protocol-buffers/docs/proto3#default

、デフォルト値は、あなたのInitResponse中で、すべてのデフォルトを変更しなかった0

でなければならない最初に定義された列挙型の値、です。あなた以外の何かを設定してみてください:)

+0

つまり、GPBとZMQを一緒に使用することはできません。デフォルトから逸脱した値を設定しないと、送信できない空の文字列に常にシリアル化されるためですZMQ(AFAIk)? – vonludi

+0

ありがとうございます。 ZMQは長さ0のメッセージを受け付けるようです。 – vonludi

+0

私はZMQを使ったことがないので、TILなんかも:) –

関連する問題