如何确定 protobuf 中的消息类型以便我可以使用 type.parsefrom(byte[ ])
How to determine message type in protobuf so that I can use that type.parsefrom(byte[ ])
我正在尝试将 protobuf 数据从 cpp 端发送到 java 端。
我在 .proto 中定义了多种消息类型
在 Cpp 端,我有每个消息类型的枚举,我将它添加到 buf 输出中,如下所示:
uint8_t* __temp = (uint8_t*)(buf);
*__temp++ = (type) >> 8;
*__temp = (type) & 0x00FF;
如何获取我添加到 buf 中的 'type',以便实现类似
的效果
MessageType parseFrom(byte[] data);
不清楚具体要求是什么。但我假设您正在尝试发送不同类型的消息,并且接收方应该能够从接收到的字节中解析出正确的对象。这可以如下例所示完成:
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对象。
"oneof" 功能可能不适用于旧版本的 protobuf 编译器。
Protobuf 3 引入了一个新概念,Any, that handles this. A good description can be found 。
我正在尝试将 protobuf 数据从 cpp 端发送到 java 端。
我在 .proto 中定义了多种消息类型
在 Cpp 端,我有每个消息类型的枚举,我将它添加到 buf 输出中,如下所示:
uint8_t* __temp = (uint8_t*)(buf);
*__temp++ = (type) >> 8;
*__temp = (type) & 0x00FF;
如何获取我添加到 buf 中的 'type',以便实现类似
的效果MessageType parseFrom(byte[] data);
不清楚具体要求是什么。但我假设您正在尝试发送不同类型的消息,并且接收方应该能够从接收到的字节中解析出正确的对象。这可以如下例所示完成:
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对象。
"oneof" 功能可能不适用于旧版本的 protobuf 编译器。
Protobuf 3 引入了一个新概念,Any, that handles this. A good description can be found