Java 中的 Google Protobufs:如何从 FieldDescriptor 获取 Message.Builder?

Jon*_*son 1 java buffer protocols protocol-buffers

我有一个 FieldDescriptor 用于在我的协议缓冲区中定义的消息字段。我想开始为该字段构建一个值,但我一直在尝试为该 FieldDescriptor 获取 Message.Builder。我正在编写的代码非常通用——它旨在在 MongoDB 和协议缓冲区之间进行序列化——所以我不能对我今天碰巧使用的对象使用任何专门的逻辑。

FieldDescriptor 的 JavaType 是 MESSAGE。它的 MessageType 好一点,因为它包含消息的类型,但类型在协议缓冲区命名空间中,所以我仍然无法使用反射来获取消息(至少不干净)。

我不知道还能做什么。有人知道如何从 FieldDescriptor 构造 Message.Builder 吗?

Ken*_*rda 5

如果您有包含类型的构建器的实例,则可以使用以下命令获取该字段的构建器:

containingBuilder.getFieldBuilder(fieldDescriptor)
Run Code Online (Sandbox Code Playgroud)

或者您可以为字段类型的消息(但不是特定于现有实例的字段)获取新的构建器:

containingBuilder.newBuilderForField(fieldDescriptor)
Run Code Online (Sandbox Code Playgroud)

如果您根本没有包含类型的实例,但您知道包含类,则可以执行以下操作:

ContainingType.getDefaultInstanceForType()
              .getField(fieldDescriptor)
              .newBuilderForType()
Run Code Online (Sandbox Code Playgroud)

如果您甚至不知道包含类(可能它甚至不在您的 jar 中),并且您拥有的只是一个描述符,那么您可以使用DynamicMessage

DynamicMessage.newBuilder(fieldDescriptor)
Run Code Online (Sandbox Code Playgroud)

但是注意,DynamicMessage只模拟真实类的反射接口;它实际上不是真实类的实例(由 生成protoc)。而且,它比真正的类要慢很多。