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

时间:2013-11-09 00:17:08

标签: java protocol-buffers

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

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

2 个答案:

答案 0 :(得分:3)

以下是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:

这就是我认为使用extensionInfo的方式(我没有尝试过我自己):

ExtensionInfo extensionInfo = registry.findExtensionByNumber(..., 101);
bm1.getField(extensionInfo.descriptor);
bm1.setField(extensionInfo.descriptor, value)

答案 1 :(得分:2)

使用setExtension方法。给出:

message Bar {
  extend Foo {
    optional string foo_string = 1;
  }
}

您可以这样构建条形消息:

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

有关详细信息,请参阅Java Generated Code documentation on extensions了解协议缓冲区。