我们如何通过在协议缓冲区中添加扩展字段来构造子消息。在C ++中,一种实现方法是通过将MutableMessage(Message,FieldDescriptor)与反射接口一起使用。我们如何在Java中做类似的事情?
我是新手,所以对协议缓冲区了解不多。
继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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句