我正在尝试编写一个模块,该模块将获取Message.Builder和从字段名称到值的Map,并将使用值填充Builder。
一切正常,直到遇到地图字段(使用Proto3)。
我得到的是一个特定的消息,我知道我可以做的字段:
builder.b.putAll<MapeFieldName>( map ),
但是我如何使用Proto反射API来实现相同的目标。
MapEntry doc说:“在反射API中,地图字段将被视为重复的消息字段,每个地图条目都将作为消息进行访问。” 但我不明白这意味着什么。
答案 0 :(得分:1)
我浪费了一些时间,并认为其他人可能会觉得它很有用:
在地图字段上使用proto反射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的医生说:&#34;用户不应该使用这个课程&#34;当我必须明确使用MapEntry.Builder时。
另外我不确定为什么protobuf不会让你只是简单的builder.setField(mapFieldDescriptor,一个java Map),它看起来更清晰。