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

2022-09-02 23:21:10

我正在尝试将原型buf数据从cpp端发送到java端。

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

在Cpp方面,我为每个消息类型都有枚举,并且我将其添加到buf输出中,如下所示:

uint8_t* __temp = (uint8_t*)(buf);
*__temp++ = (type) >> 8;
*__temp = (type) & 0x00FF;

我如何获得我添加到buf中的这个“类型”,以便我可以实现类似的东西

MessageType parseFrom(byte[] data);

答案 1

目前尚不清楚确切的要求是什么。但是我假设您正在尝试发送不同类型的消息,并且接收方应该能够从接收到的字节中解析出正确的对象。这可以按照下面的示例完成:

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;
    }   
}

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

“其中一个”功能在旧版本的protobuf编译器上可能不可用。


答案 2

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


推荐