【问题标题】:How do I set extension to protobuf DynamicMessage in java?java - 如何在java中将扩展设置为protobuf DynamicMessage?
【发布时间】:2017-12-04 09:44:29
【问题描述】:

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

我的问题是设置此类消息的扩展名。

我有:

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

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

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

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

请建议我如何将它们组合在一起。

要了解上下文,您可能需要查看我之前关于此主题的不关心扩展的问题:Protocol buffer objects generated at runtime

编辑:

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

【问题讨论】:

    标签: java protocol-buffers


    【解决方案1】:

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

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

    message Foo { extensions 1000 to max; }
    message Bar { ... }
    extend Foo {
      optional Bar ext1 = 1234;
      optional Bar ext2 = 2345;
    }
    

    请注意,我们声明了 两个Foo 类型为 Bar 的扩展。因此,仅仅知道您正在寻找Bar 类型的扩展是不够的——您必须指定哪一个。

    无论如何,FileDescriptorDescriptor 等各种描述符类型都有findExtensionByName() 方法,可用于查找扩展描述符。请注意,此方法会查找在您调用它的描述符的 范围 内声明的扩展——它不会找到 to 该消息类型的扩展。也就是说,如果你有:

    message Foo { extensions 1000 to max; }
    message Bar {
      extend Foo {
        optional int32 ext1 = 1234;
      }
    }
    extend Foo {
        optional int32 ext2 = 2345;
    }
    

    为了找到扩展 ext1,您必须在 Descriptor 上为 Bar 调用 findExtensionByName("ext1")不是Foo 的描述符。要找到ext2,您必须在文件的FileDescriptor 上调用findExtensionByName("ext2")

    您可能还想查看 ExtensionRegistry 类,它可用于通过其完全限定名称(例如 "mypackage.Bar.ext1")查找扩展,但这需要您首先注册您的描述符重新感兴趣,所以它可能不是很有帮助。

    【讨论】:

      【解决方案2】:

      我也尝试在 C++ 中找到解决方案,使用以下代码似乎更容易:

      const Reflection* reflection = merged_doc_info.GetReflection();<br/>
      const FieldDescriptor * ext_fld=reflection->FindKnownExtensionByName("msg.usage");
      assert(ext_fld!=0);
      reflection->SetUInt32(&merged_doc_info,ext_fld,123);
      

      另一种方法是模拟protoc命令的作用,生成java代码行 喜欢

      msgBuilder.setExtension(msg.usage, "1"); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        • 2022-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        相关资源
        最近更新 更多