考虑到我有字节数组 - byte [] ,它代表某种序列化的protobuf对象。有没有办法将其打印到输出,如
1: 123
2: Jhon
3: Doe
4: 0
其中1是int字段,2和3是字符串,4是boolen
TextFormat.print 要求我提供protobuf对象的具体 Builder ,我不知道。
答案 0 :(得分:4)
定义类型EmptyMessage
,如:
message EmptyMessage {
// nothing
}
现在将您的邮件解析为EmptyMessage
,然后在其上调用toString()
。
为什么这样做?好吧,请考虑向消息类型添加字段是向后兼容的。添加字段时,然后使用该字段将消息发送到未使用该字段知识构建的旧程序,则该字段将被视为“未知字段”。未知字段打印为数字/值对。现在,如果您从EmptyMessage
开始并添加字段,您显然可以获得任何其他消息。因此,所有消息类型都与EmptyMessage
“向后兼容”。因此,任何消息都可以解析为EmptyMessage
,以将所有字段视为未知字段。
答案 1 :(得分:1)
如果我们可以假设这些字段都是原始类型(即不是子消息),那么你应该能够非常简单地遍历所有字段 -
for(Entry<FieldDescriptor, Object> entry : msg.getAllFields().entrySet())
{
if(entry.getValue() != null)
System.out.println(entry.getKey().getName() + ": " + entry.getValue().toString());
else
System.out.println(entry.getKey().toString() + ": null");
}
但是,我很确定protobuf对象正确实现了toString()方法,所以我认为你应该可以简单地调用
protoObj.toString()
获取protobuf对象的字符串表示形式。 有关详细信息,请查看: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/GeneratedMessage.ExtendableMessage#getAllFields%28%29