Jan*_*yka 2 java protocol-buffers
我正在运行时DynamicMessage从.proto加载的文件中构建java .
我的问题是将扩展设置为此类消息.
我有:
Descriptors.Descriptor包含类型并DynamicMessage为其创建Descriptors.Descriptor扩展类型并DynamicMessage为其创建现在我不知道如何设置包含消息的扩展名.
如果我要求字段列表,则包含描述符仅列出没有扩展字段的字段.这是有道理的.
扩展描述符只包含扩展类型的字段(它没有包含类型的字段).
请告诉我如何将它们组合在一起.
要了解上下文,您可能需要查看我之前关于此主题的问题,该问题与扩展无关:在运行时生成的协议缓冲区对象
编辑:
事实上,我正在寻找.setExtension生成的消息的类比.我注意到只有GeneratedMessage延伸,ExtendableMessage但我相信一定有办法:)
扩展由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")对Descriptor对Bar,不是在描述符Foo.要查找ext2,您必须调用findExtensionByName("ext2")该文件FileDescriptor.
您可能还想查看ExtensionRegistry该类,该类可用于通过其完全限定名称查找扩展名(例如"mypackage.Bar.ext1"),但这要求您首先注册您感兴趣的描述符,因此可能不是非常有帮助.