Java打印未知类型的protobuf对象

时间:2016-03-14 13:19:53

标签: java protocol-buffers

考虑到我有字节数组 - byte [] ,它代表某种序列化的protobuf对象。有没有办法将其打印到输出,如

1: 123
2: Jhon
3: Doe
4: 0

其中1是int字段,2和3是字符串,4是boolen

TextFormat.print 要求我提供protobuf对象的具体 Builder ,我不知道。

2 个答案:

答案 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