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

标签 java buffer protocols protocol-buffers

我有一个在 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/

相关文章:

java - Tomcat 6 上的 CORS

Java HTTP 请求缓冲区大小

c#:与设备通信期间数据缓冲区发生奇怪的偏移

ios - Swift 委托(delegate)永远不会被调用

java - "java.security.cert.CertificateException: No name matching localhost found"无法在 Ubuntu 16.04 LTS 上解析

使用 WritableImage 的 JavaFX 透明光标

php - 使用字符串调用 PHP 语言构造

Java分布式应用程序-消息传递

java - 如何开始逆向工程 SpaceNavigator 外围数据流?

java - 如何在 Java 中围绕二维锯齿状数组打印边框