gpt4 book ai didi

java - Java : How do you get a Message. Builder 中的 Google Protobufs 来自 FieldDescriptor?

转载 作者:行者123 更新时间:2023-12-01 18:18:44 25 4
gpt4 key购买 nike

我有一个在 Protocol Buffer 中定义的消息字段的 FieldDescriptor。我想开始为该字段构造一个值,但我一直在尝试为该 FieldDescriptor 获取 Message.Builder。我正在编写的代码非常通用 - 它旨在在 MongoDB 和 Protocol Buffers 之间进行序列化 - 因此我无法对我今天碰巧使用的对象使用任何专门的逻辑。

FieldDescriptor 的 JavaType 是 MESSAGE。它的 MessageType 好一点,因为它包含消息的 Type,但 Type 位于 Protocol Buffer 命名空间中,所以我仍然无法使用反射来获取它的 Message(至少不能干净地)。

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

最佳答案

如果您有包含类型的构建器的实例,则可以通过以下方式获取该字段的构建器:

containingBuilder.getFieldBuilder(fieldDescriptor)

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

containingBuilder.newBuilderForField(fieldDescriptor)

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

ContainingType.getDefaultInstanceForType()
.getField(fieldDescriptor)
.newBuilderForType()

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

DynamicMessage.newBuilder(fieldDescriptor)

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

关于java - Java : How do you get a Message. Builder 中的 Google Protobufs 来自 FieldDescriptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28161527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com