如何在java中设置protobuf DynamicMessage的扩展名?

Jan*_*yka 2 java protocol-buffers

我正在运行时DynamicMessage.proto加载的文件中构建java .

我的问题是将扩展设置为此类消息.

我有:

  • Descriptors.Descriptor包含类型并DynamicMessage为其创建
  • Descriptors.Descriptor扩展类型并DynamicMessage为其创建

现在我不知道如何设置包含消息的扩展名.

如果我要求字段列表,则包含描述符仅列出没有扩展字段的字段.这是有道理的.

扩展描述符只包含扩展类型的字段(它没有包含类型的字段).

请告诉我如何将它们组合在一起.

要了解上下文,您可能需要查看我之前关于此主题的问题,该问题与扩展无关:在运行时生成的协议缓冲区对象

编辑:

事实上,我正在寻找.setExtension生成的消息的类比.我注意到只有GeneratedMessage延伸,ExtendableMessage但我相信一定有办法:)

Ken*_*rda 6

扩展由FieldDescriptors 描述,就像常规字段一样,因此在使用动态接口时,实际上使用完全相同的方法来访问其中任何一个.

请记住,扩展实际上是从扩展类型或扩展类型独立声明的.例如,这是有效的:

message Foo { extensions 1000 to max; }
message Bar { ... }
extend Foo {
  optional Bar ext1 = 1234;
  optional Bar ext2 = 2345;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们声明了两个Foo类型的扩展Bar.所以,仅仅知道你正在寻找类型的扩展Bar是不够的 - 你必须指定哪一个.

在任何情况下,各种描述符类型都喜欢FileDescriptor并且Descriptor具有findExtensionByName()可用于查找扩展描述符的方法.注意,此方法会寻找内声明的扩展范围上,你把它叫做描述的-它没有找到扩展该消息类型.也就是说,如果你有:

message Foo { extensions 1000 to max; }
message Bar {
  extend Foo {
    optional int32 ext1 = 1234;
  }
}
extend Foo {
    optional int32 ext2 = 2345;
}
Run Code Online (Sandbox Code Playgroud)

为了找到扩展ext1,你得打个电话findExtensionByName("ext1")DescriptorBar,不是在描述符Foo.要查找ext2,您必须调用findExtensionByName("ext2")该文件FileDescriptor.

您可能还想查看ExtensionRegistry该类,该类可用于通过其完全限定名称查找扩展名(例如"mypackage.Bar.ext1"),但这要求您首先注册您感兴趣的描述符,因此可能不是非常有帮助.