Java 在另一个PB消息中存储未指定的协议缓冲区消息?

Java 在另一个PB消息中存储未指定的协议缓冲区消息?,java,protocol-buffers,Java,Protocol Buffers,我正在尝试使用Google的协议缓冲区(Java)编写一个“可扩展”的文件格式。API应该可以读取数据,并返回一条“容器”消息(已知类型),其中包含一些其他未知类型的消息(但API调用方知道这些消息) 在PB定义和Java代码中,有哪些可能的方法可以做到这一点 一种显而易见的方法是将实现未指定消息的类名以及包含消息数据的字节数组存储在“container”消息中。但我不知道如何使用反射从它的类和字节数组创建消息 另一种方法可能是使用“扩展”机制,但我真的不知道怎么做?如果你有正确的类名和字节数组

我正在尝试使用Google的协议缓冲区(Java)编写一个“可扩展”的文件格式。API应该可以读取数据,并返回一条“容器”消息(已知类型),其中包含一些其他未知类型的消息(但API调用方知道这些消息)

在PB定义和Java代码中,有哪些可能的方法可以做到这一点

一种显而易见的方法是将实现未指定消息的类名以及包含消息数据的字节数组存储在“container”消息中。但我不知道如何使用反射从它的类和字节数组创建消息


另一种方法可能是使用“扩展”机制,但我真的不知道怎么做?

如果你有正确的类名和字节数组,你可以通过反射实例化相应的
生成器
,然后在其上调用
mergeFrom(byte[])
方法,但发出了如下一般信息:

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
,并将其与头信息一起返回给应用程序。在应用程序之间,您需要确保正确获取名称和类型。

谢谢!“CLASS x=CLASS.newBuilder().mergeFrom(BYTES).build()”在接受您关于“快速序列化/反序列化(无需反射)”的回答之前,我将等待一段时间,看看是否有人能告诉我如何使用扩展来实现……反射部分应该是最小的。现实地说,你只需要在遇到的每堂课上做一次。为其实例化的生成器可以重复使用。除非每条消息都不同,或者消息的数量非常少,否则反射的开销应该可以忽略不计。确实,您可以重用它。