我使用的是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中,不再有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()
,但我认为此方法不会打印每个字段,因为我总是打印空字符串。
如果序列化没有失败,为什么我的序列化消息会变空?
答案 0 :(得分:1)
https://developers.google.com/protocol-buffers/docs/proto3#default
对于枚举,默认值是第一个定义的枚举值,必须为0.
您并未在InitResponse
中更改默认设置。尝试设置除此之外的任何其他内容:)