Google Java 中的 Protobufs:如何从 FieldDescriptor 中获取 Message.Builder?
Google Protobufs in Java: How do you get a Message.Builder from a FieldDescriptor?
我有一个 FieldDescriptor 用于在我的协议缓冲区中定义的消息字段。我想开始为该字段构建一个值,但我一直在尝试为该 FieldDescriptor 获取 Message.Builder。我正在编写的代码非常通用 - 它旨在在 MongoDB 和 Protocol Buffers 之间进行序列化 - 所以我不能对我今天碰巧使用的对象使用任何专门的逻辑。
FieldDescriptor 的 JavaType 是 MESSAGE。它的 MessageType 好一点,因为它包含消息的类型,但是类型在协议缓冲区命名空间中,所以我仍然不能使用反射为其获取消息(至少不干净)。
我不确定还能做什么。有人知道如何从 FieldDescriptor 构造 Message.Builder 吗?
如果您有包含类型构建器的实例,您可以通过以下方式获取该字段的构建器:
containingBuilder.getFieldBuilder(fieldDescriptor)
或者您可以为字段类型(但不是特定的现有实例的字段)的消息获取新构建器:
containingBuilder.newBuilderForField(fieldDescriptor)
如果你根本没有包含类型的实例,但你知道包含 class,你可以这样做:
ContainingType.getDefaultInstanceForType()
.getField(fieldDescriptor)
.newBuilderForType()
如果您甚至不知道包含 class(也许它甚至不在您的 jar 中),而您只有一个描述符,那么您可以使用 DynamicMessage
:
DynamicMessage.newBuilder(fieldDescriptor)
但是注意DynamicMessage
只是模拟了真实class的反射接口;它实际上不是真实 class 的实例(由 protoc
生成)。而且,它比真正的 class.
慢很多
我有一个 FieldDescriptor 用于在我的协议缓冲区中定义的消息字段。我想开始为该字段构建一个值,但我一直在尝试为该 FieldDescriptor 获取 Message.Builder。我正在编写的代码非常通用 - 它旨在在 MongoDB 和 Protocol Buffers 之间进行序列化 - 所以我不能对我今天碰巧使用的对象使用任何专门的逻辑。
FieldDescriptor 的 JavaType 是 MESSAGE。它的 MessageType 好一点,因为它包含消息的类型,但是类型在协议缓冲区命名空间中,所以我仍然不能使用反射为其获取消息(至少不干净)。
我不确定还能做什么。有人知道如何从 FieldDescriptor 构造 Message.Builder 吗?
如果您有包含类型构建器的实例,您可以通过以下方式获取该字段的构建器:
containingBuilder.getFieldBuilder(fieldDescriptor)
或者您可以为字段类型(但不是特定的现有实例的字段)的消息获取新构建器:
containingBuilder.newBuilderForField(fieldDescriptor)
如果你根本没有包含类型的实例,但你知道包含 class,你可以这样做:
ContainingType.getDefaultInstanceForType()
.getField(fieldDescriptor)
.newBuilderForType()
如果您甚至不知道包含 class(也许它甚至不在您的 jar 中),而您只有一个描述符,那么您可以使用 DynamicMessage
:
DynamicMessage.newBuilder(fieldDescriptor)
但是注意DynamicMessage
只是模拟了真实class的反射接口;它实际上不是真实 class 的实例(由 protoc
生成)。而且,它比真正的 class.