使用反射填充 Proto 中的地图字段 API
Filling up a map field in Proto using reflection API
我正在尝试编写一个模块,它将获得一个 Message.Builder 和一个从字段名称到值的映射,并将用这些值填充生成器。
一切正常,直到遇到地图字段(使用 Proto3)。
我得到了一条特定的消息,我知道我可以做的字段:
builder.b.putAll<MapeFieldName>( map ),
但是我如何使用 Proto 反射 API 来实现同样的效果。
MapEntry doc 说:“在反射 API 中,映射字段将被视为重复的消息字段,每个映射条目都作为消息访问."
但是我不太明白那是什么意思。
我在这上面浪费了一些时间,认为其他人可能会发现它有用:
在地图字段上使用原型反射 API 时,您确实将地图字段视为 com.google.protobuf.MapEntry:
的重复字段
FieldDescriptor mapFieldDescriptor = protoDescriptor.findFieldByName( map_field_name );
MapEntry.Builder entryBuilder = ( MapEntry.Builder ) topProtoBuilder.newBuilderForField( mapFieldDescriptor );
然后对于我地图中的每个条目:
entryBuilder.setKey( e.getKey() );
entryBuilder.setValue( e.getValue() );
underlyingProtoBuilder.addRepeatedField( mapFieldDescriptor , entryBuilder.build() );
唯一仍然困扰我的是 MapEntry 文档说:"Users shouldn't use this class" 当我不得不明确使用 MapEntry.Builder.
我也不确定为什么 protobuf 不让你简单地 builder.setField( mapFieldDescriptor ,一个 java Map )看起来更干净。
我正在尝试编写一个模块,它将获得一个 Message.Builder 和一个从字段名称到值的映射,并将用这些值填充生成器。
一切正常,直到遇到地图字段(使用 Proto3)。
我得到了一条特定的消息,我知道我可以做的字段:
builder.b.putAll<MapeFieldName>( map ),
但是我如何使用 Proto 反射 API 来实现同样的效果。
MapEntry doc 说:“在反射 API 中,映射字段将被视为重复的消息字段,每个映射条目都作为消息访问." 但是我不太明白那是什么意思。
我在这上面浪费了一些时间,认为其他人可能会发现它有用:
在地图字段上使用原型反射 API 时,您确实将地图字段视为 com.google.protobuf.MapEntry:
的重复字段FieldDescriptor mapFieldDescriptor = protoDescriptor.findFieldByName( map_field_name );
MapEntry.Builder entryBuilder = ( MapEntry.Builder ) topProtoBuilder.newBuilderForField( mapFieldDescriptor );
然后对于我地图中的每个条目:
entryBuilder.setKey( e.getKey() );
entryBuilder.setValue( e.getValue() );
underlyingProtoBuilder.addRepeatedField( mapFieldDescriptor , entryBuilder.build() );
唯一仍然困扰我的是 MapEntry 文档说:"Users shouldn't use this class" 当我不得不明确使用 MapEntry.Builder.
我也不确定为什么 protobuf 不让你简单地 builder.setField( mapFieldDescriptor ,一个 java Map )看起来更干净。