Jan*_*yka 2 java protocol-buffers
我正在运行时DynamicMessage
从.proto
加载的文件中构建java .
我的问题是将扩展设置为此类消息.
我有:
Descriptors.Descriptor
包含类型并DynamicMessage
为其创建Descriptors.Descriptor
扩展类型并DynamicMessage
为其创建现在我不知道如何设置包含消息的扩展名.
如果我要求字段列表,则包含描述符仅列出没有扩展字段的字段.这是有道理的.
扩展描述符只包含扩展类型的字段(它没有包含类型的字段).
请告诉我如何将它们组合在一起.
要了解上下文,您可能需要查看我之前关于此主题的问题,该问题与扩展无关:在运行时生成的协议缓冲区对象
编辑:
事实上,我正在寻找.setExtension
生成的消息的类比.我注意到只有GeneratedMessage
延伸,ExtendableMessage
但我相信一定有办法:)
扩展由FieldDescriptor
s 描述,就像常规字段一样,因此在使用动态接口时,实际上使用完全相同的方法来访问其中任何一个.
请记住,扩展实际上是从扩展类型或扩展类型独立声明的.例如,这是有效的:
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"
),但这要求您首先注册您感兴趣的描述符,因此可能不是非常有帮助.
归档时间: |
|
查看次数: |
3045 次 |
最近记录: |