我正在尝试使用Google的Protocol Buffers(Java)编写一个“可扩展”的文件格式。 API应该可以读取数据,并返回包含一些其他未知类型消息的“容器”消息(已知类型)(但API调用者知道这些消息)。
PB定义和Java代码中有哪些可能的方法来执行此操作?
一种显而易见的方法是在“容器”消息中存储实现未指定消息的类名以及包含消息数据的字节数组。但我不知道如何使用反射从它的类和字节数组创建消息。
另一种方法可能是使用“扩展”机制,但我真的不知道如何做到这一点?
答案 0 :(得分:3)
如果你有正确的类名和字节数组,你可以通过反射实例化相应的Builder
,然后在其上调用mergeFrom(byte[])
方法。
答案 1 :(得分:0)
我们做了类似的事情,但做了如下通用信息:
message GenericMessage {
required int32 id = 1;
// further generic message headers
message IntegerVariable {
required string name = 1;
optional int32 data = 2;
}
repeated IntegerVariable integerVars = 2;
message IntegerArrayVariable {
required string name = 1;
repeated int32 data = 2;
optional int32 length = 3;
}
repeated IntegerArrayVariable integerArrayVars = 3;
message DoubleVariable {
required string name = 1;
optional double data = 2;
}
repeated DoubleVariable doubleVars = 4;
...
message RawVariable {
required string name = 1;
optional bytes data = 2;
}
repeated RawVariable rawVars = x;
}
这允许您为许多可能的情况使用一个缓冲区,并且仍然提供快速序列化/反序列化的优势(不需要反射)。缓冲区可以包含可以标记为必需或可选的标头变量以及许多重复的有效负载变量。这使得消息仍然非常小,尽管它非常通用。
如果您创建一个额外的图层来处理这些消息,我建议将消息处理为HashMap<String, Object>
并将其与标题信息一起返回给应用程序。在应用程序之间,您需要确保正确获取名称和类型。