私は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()
を使ってみましたが、私は空の文字列を印刷してしまうので、このメソッドはすべてのフィールドを表示しません。
シリアル化が失敗しないと、シリアル化されたメッセージが空になるのはなぜですか?列挙型の場合
つまり、GPBとZMQを一緒に使用することはできません。デフォルトから逸脱した値を設定しないと、送信できない空の文字列に常にシリアル化されるためですZMQ(AFAIk)? – vonludi
ありがとうございます。 ZMQは長さ0のメッセージを受け付けるようです。 – vonludi
私はZMQを使ったことがないので、TILなんかも:) –