如何确定protobuf中的消息类型,以便我可以使用该类型.parsefrom(byte [])

and*_*per 12 java protocol-buffers

我试图将cpp端的protobuf数据发送到java端.

我在.proto中定义了多种消息类型

在Cpp方面,我有每个消息类型的枚举,我将它添加到buf输出,如下所示:

uint8_t* __temp = (uint8_t*)(buf);
*__temp++ = (type) >> 8;
*__temp = (type) & 0x00FF;
Run Code Online (Sandbox Code Playgroud)

如何获得我添加到buf中的"类型",以便我可以实现类似的功能

MessageType parseFrom(byte[] data);
Run Code Online (Sandbox Code Playgroud)

Nip*_*dar 22

目前尚不清楚具体要求是什么.但我假设你正在尝试发送不同类型的消息,接收器应该能够从接收到的字节中解析出正确的对象.这可以如下例所示完成:

message Message1 {
   required string a = 1;
   required string b = 2;
}

message Message2 {
   required int64 id = 1;
   required string data = 2;
}




message WrapperMessage {
    required int64 commonField = 1;
    oneof msg {
        Message1 m1 = 2;
        Message2 m2 = 3;
    }   
}
Run Code Online (Sandbox Code Playgroud)

基本上,总是通过包装Message1或Message2对象的线路发送WrapperMessage对象.然后在接收端,我们可以先解析WrapperMessage对象,然后使用HasField方法检查包装对象中是否存在m1或m2字段,然后解析Message1或Message2对象.

旧版本的protobuf编译器可能无法使用"oneof"功能.

  • @android.developer 该文档已过时;它早于“oneof”的引入。如果您使用 protobuf 2.6 或更高版本,则绝对应该使用“oneof”。我为 protobuf 人员提交了一个错误来更新文档。https://github.com/google/protobuf/issues/452 (2认同)

Phi*_*son 5

Protobuf 3 引入了一个新概念Any来处理这个问题。可以在这里找到很好的描述。

  • 您如何比较使用 Any 和 Oneof?Oneof 不是更好吗,因为它对于可接受的类型更加明确? (3认同)