有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

协议缓冲区类型未知的Java打印protobuf对象

认为我有字节数组-Byth[]eEM>,它代表某种序列化的原BUBF对象。有没有办法把它打印出来,比如

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

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

文本格式。print要求我提供protobuf对象的具体生成器,我不知道


共 (2) 个答案

  1. # 1 楼答案

    定义类型EmptyMessage,如:

    message EmptyMessage {
      // nothing
    }
    

    现在将消息解析为EmptyMessage,然后对其调用toString()

    为什么这样做有效?考虑到将字段添加到消息类型是向后兼容的。当您添加一个字段时,然后使用该字段向一个没有使用该字段知识构建的旧程序发送一条消息,那么该字段将被视为“未知字段”。未知字段打印为数字/值对。现在,如果您从EmptyMessage开始并添加字段,显然可以获得任何其他消息。因此,所有消息类型都与EmptyMessage“向后兼容”。因此,任何消息都可以解析为EmptyMessage,以将所有字段视为未知字段

  2. # 2 楼答案

    如果我们可以假设字段都是基本类型(即不是子消息),那么您应该能够非常简单地遍历所有字段-

    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