Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java协议缓冲区-使用扩展字段构造子消息_Java_Protocol Buffers - Fatal编程技术网

java协议缓冲区-使用扩展字段构造子消息

java协议缓冲区-使用扩展字段构造子消息,java,protocol-buffers,Java,Protocol Buffers,我们如何通过在协议缓冲区中添加扩展字段来构造子消息。在C++中,一种方式是使用MutableMessage(消息,FieldDescriptor)与反射接口。我们如何在Java中做类似的事情 我是个新手,所以不太了解协议缓冲区。使用setExtension方法。鉴于: message Bar { extend Foo { optional string foo_string = 1; } } 您可以按如下方式构建条形消息: Foo foo = Foo.newBuilder()

我们如何通过在协议缓冲区中添加扩展字段来构造子消息。在C++中,一种方式是使用MutableMessage(消息,FieldDescriptor)与反射接口。我们如何在Java中做类似的事情


我是个新手,所以不太了解协议缓冲区。

使用
setExtension
方法。鉴于:

message Bar {
  extend Foo {
    optional string foo_string = 1;
  }
}
您可以按如下方式构建条形消息:

Foo foo = Foo.newBuilder()
    .setExtension(Bar.fooString, "My foo string")
    .build();

有关更多详细信息,请参阅协议缓冲区。

以下是jonathons的答案,下面是在java中创建和访问扩展的示例

Protobuf定义:

message Message
{
    extensions 100 to max;

    required uint64 A = 1;
}

message Event
{
    extend Message { 
        required Event ext = 101; 
        optional string name = 102;
    }

    extensions 100 to max;

    required uint64 B = 1;

}
使用扩展名:

Extension01.Message.Builder bm = Extension01.Message.newBuilder();
Extension01.Message.Builder bm1 = Extension01.Message.newBuilder();
Extension01.Event.Builder be = Extension01.Event.newBuilder();
FileOutputStream out = new FileOutputStream(extFileOut);

be.setB(5678);


bm.setA(123);
bm.setExtension(Extension01.Event.ext, be.build()); // set the extension value

bm.build().writeDelimitedTo(out);
out.close();

FileInputStream in = new FileInputStream(extFileOut);

ExtensionRegistry registry = ExtensionRegistry.newInstance(); // create extension registry
Extension01.registerAllExtensions(registry);  // Allocate the extensions 
bm1.mergeDelimitedFrom(in, registry);
in.close();

Event extension = bm1.getExtension(Extension01.Event.ext); // get the extension
if (extension == null) {
    System.out.println("No extension");
} else {
    System.out.println(extension.getB());
}
编辑:

Line setting extension value:

bm.setExtension(Extension01.Event.ext, be.build());
变量Extension01.Event.ext由协议缓冲区生成,可用于获取/放置扩展的值

编辑2:

Line setting extension value:

bm.setExtension(Extension01.Event.ext, be.build());
我认为extensionInfo就是这样使用的(我自己还没有尝试过):


谢谢如何从给定的扩展编号中检索扩展标识符?协议缓冲区生成一个静态的最终变量,可用于访问扩展类。我无法完全理解它。参考您的解决方案+protobuf javadocs,我能够通过使用给定的扩展编号(我使用registeralExtensions()和findExtensionByNumber()获得扩展信息)。但是,我现在需要使用setExtension()来生成带有嵌入式扩展的消息,它需要GenerateExtension作为参数之一。您知道如何使用extensioninfo设置扩展吗?或者我在这里做错了什么?请参见上面示例中的bm.setExtension行。很抱歉,我仍然没有完全理解它。您的解决方案在哪里引用任何可在setExtension()方法中使用的ExtensionInfo对象?我只看到您使用setExtension(),第一个参数是扩展标识符,第二个参数是从扩展中生成的值。由协议缓冲区生成的变量Extension01.Event.ext可用于设置和检索扩展的值。对于生成的消息,它实际上不起作用。注册表类上有一个getExtensionByName方法,然后在getField中使用描述符变量??方法;做点手脚吧。或者,DynamicMessage允许按数字检索,但对于DynamicMessage,您没有生成的协议缓冲区