Google协议缓冲区3.0 - 序列化长度为0后set_field(...)

时间:2017-01-11 14:20:13

标签: protocol-buffers

我使用的是Google Protobuf 3.0.0。和ZeroMQ实现服务器和某些客户端之间的连接。所以,我的proto文件看起来像这样:

// 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中,不再有requiredoptional个字段,我不使用任何默认值。 现在,在序列化一些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 个答案:

答案 0 :(得分:1)

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

  

对于枚举,默认值是第一个定义的枚举值,必须为0.

您并未在InitResponse中更改默认设置。尝试设置除此之外的任何其他内容:)