gpt4 book ai didi

java - 使用反射 API 填充 Proto 中的 map 字段

转载 作者:行者123 更新时间:2023-11-30 10:31:04 24 4
gpt4 key购买 nike

我正在尝试编写一个模块,它将获取一个 Message.Builder 和一个从字段名称到值的 Map,并将用值填充 Builder。

在遇到 map 字段(使用 Proto3)之前一切正常。

我得到了一条我知道我可以做的字段的特定消息:

builder.b.putAll<MapeFieldName>( map ),

但是我该如何使用 Proto 反射 API 来实现相同的目的。

MapEntry doc说:“在反射 API 中,映射字段将被视为重复的消息字段,每个映射条目都作为消息访问。”但我不太明白那是什么意思。

最佳答案

我在这上面浪费了一些时间,并认为其他人可能会觉得它有用:

当在 map 字段上使用 proto 反射 API 时,您确实将 map 字段视为 com.google.protobuf.MapEntry 的重复字段:

FieldDescriptor mapFieldDescriptor = protoDescriptor.findFieldByName( map_field_name );
MapEntry.Builder entryBuilder = ( MapEntry.Builder ) topProtoBuilder.newBuilderForField( mapFieldDescriptor );

然后对于我 map 中的每个条目:

entryBuilder.setKey( e.getKey() );
entryBuilder.setValue( e.getValue() );
underlyingProtoBuilder.addRepeatedField( mapFieldDescriptor , entryBuilder.build() );

唯一仍然困扰我的是 MapEntry 文档说:“用户不应该使用此类”,而我不得不显式使用 MapEntry.Builder。

另外我不确定为什么 protobuf 不让你简单地使用 builder.setField( mapFieldDescriptor , a java Map ) 这看起来更干净。

关于java - 使用反射 API 填充 Proto 中的 map 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43364297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com