使用反射 API 填充 Proto 中的地图字段

har*_*rel 2 java protocol-buffers

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

一切正常,直到我遇到地图字段(使用 Proto3 )。

我收到一条特定消息,我知道我可以执行该消息的字段:

builder.b.putAll<MapeFieldName>( map ),
Run Code Online (Sandbox Code Playgroud)

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

MapEntry文档说:“在反射 API 中,地图字段将被视为重复消息字段,并且每个地图条目都作为消息进行访问。” 但我不太明白这意味着什么。

har*_*rel 6

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

在地图字段上使用原始反射 API 时,您确实将地图字段视为 com.google.protobuf.MapEntry 的重复字段:

FieldDescriptor mapFieldDescriptor = protoDescriptor.findFieldByName( map_field_name );
MapEntry.Builder entryBuilder = ( MapEntry.Builder ) topProtoBuilder.newBuilderForField( mapFieldDescriptor );
Run Code Online (Sandbox Code Playgroud)

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

entryBuilder.setKey( e.getKey() );
entryBuilder.setValue( e.getValue() );
underlyingProtoBuilder.addRepeatedField( mapFieldDescriptor , entryBuilder.build() );
Run Code Online (Sandbox Code Playgroud)

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

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