带反射的嵌套协议缓冲区

乔恩

说我在.proto文件中有一条消息,内容如下

Message Foo {
    Message Bar {
        optional int32 a = 1;
        optional int32 b = 2;
    }
    optional Bar bar = 1;
}

在Java中,是否仅使用字符串“ bar.a”来设置字段a?理想情况下,我想编写如下方法:

public Foo.Builder apply(Foo.Builder builder, String fieldPath, Object value) {
    // fieldPath == "bar.a"
    // This doesn't work
    FieldDescriptor fd = builder.getDefaultInstanceForType().findFieldByName(fieldPath);
    builder = builder.setField(fd, value);
}

但是,当我这样做时,我得到了一个IllegalArgumentException。

有谁知道如何以通用的方式做到这一点?

我也需要走另一条路

public Object getValue(Foo message, String fieldPath) {
    // This doesn't work
    FieldDescriptor fd = message.getDefaultInstanceForType().findFieldByName(fieldPath);
    return message.getField(fieldPath);
}

请注意,如果fieldPath不包含分隔符(。),并且引用了基本消息,但没有嵌套消息,则此方法很好用。

肯顿·瓦尔达(Kenton Varda)

您需要在“。”上拆分字段路径。并进行一系列查找,例如

Message subMessage =
    (Message)message.getField(
        message.getDescriptorForType().findFieldByName("bar"));
return subMessage.getField(
    subMessage.getDescriptorForType().findFieldByName("a"));

或写:

FieldDescriptor desc = message.getDescriptorForType().findFieldByName("bar");
Message.Builder subBuilder = (Message.Builder)builder.getFieldBuilder(desc);
subBuilder.setField(
    subMessage.getDescriptorForType().findFieldByName("a"), value);
builder.setField(desc, subBuilder.build());

您当然可以编写一个库,该库将字符串拆分并在一个调用中进行所有查找(并进行正确的错误检查)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带反射的嵌套协议缓冲区

来自分类Dev

Java协议缓冲区-反射

来自分类Dev

协议缓冲区-分配嵌套消息

来自分类Dev

在C ++中解析协议缓冲区

来自分类Dev

Scala Akka和协议缓冲区

来自分类Dev

带有协议缓冲区的RPC

来自分类Dev

协议缓冲区Wireshark插件

来自分类Dev

改善协议缓冲区的性能

来自分类Dev

协议缓冲区消息的字节序

来自分类Dev

协议缓冲区:版本更改

来自分类Dev

REST是否支持协议缓冲区

来自分类Dev

损坏的协议缓冲区消息

来自分类Dev

Ionic 4协议缓冲区

来自分类Dev

协议缓冲区损坏数据

来自分类Dev

在协议缓冲区中分隔消息

来自分类Dev

Java协议缓冲区-消息大小

来自分类Dev

谷歌协议缓冲区漂亮的打印

来自分类Dev

带有CMakeLists的协议缓冲区

来自分类Dev

协议缓冲区与 codelite 的静态链接

来自分类Dev

如何在协议缓冲区中设置嵌套消息的字段?

来自分类Dev

Python中的协议缓冲区:如何为嵌套元素设置值

来自分类Dev

缓冲区溢出,带删除[]

来自分类Dev

带时间戳的环形缓冲区

来自分类Dev

在协议缓冲区消息中存储二进制数据缓冲区

来自分类Dev

协议缓冲区-重复布尔值的最佳实践

来自分类Dev

无法获取Google协议缓冲区进行编译

来自分类Dev

纯虚拟方法称为错误Google协议缓冲区

来自分类Dev

Golang Google协议缓冲区中的错误

来自分类Dev

使用协议缓冲区的Python项目,部署问题