我有一个比较器来解析String(例如car-00001)并进行数字比较:
public final class IdUtils {
public enum MyNumericIdComparator implements Comparator<String>, Serializable {
INSTANCE;
public int compare(String s1, String s2) {
Optional<Long> l1 = IdUtils.parseNumericIdOrNull(s1);
if (l1.isPresent()) {
Optional<Long> l2 = IdUtils.parseNumericIdOrNull(s2);
if (l2.isPresent()) {
return l1.get().compareTo(l2.get());
}
}
return s1.compareTo(s2);
}
TreeMap是使用
创建的public class MyOuterObject {
private NavigableMap<String, MyObject> map;
//other fields
@JsonCreator
public ResourceInstanceSetEntity(@JsonProperty("resourceSetId") final String resourceSetId) {
super();
this.map = Maps.newTreeMap(IdUtils.MyNumericIdComparator.INSTANCE);
...
}
}
但是当我使用Jackson Mapper对其进行序列化时,输出json不会记录比较器信息,反序列化的映射也没有比较器:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY);
objectMapper.setVisibility(JsonMethod.GETTER, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(JsonMethod.IS_GETTER, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(JsonMethod.SETTER, JsonAutoDetect.Visibility.NONE);
objectMapper.registerModule(new GuavaModule());
MyOuterObject set = new MyOuterObject("some id");
set.putMap(a,b); //add a record to map
String json = objectMapper.writeValueAsString(set);
我想念什么?
编辑: 我试图避免反序列化创建没有比较器的地图,当我需要使用它时,创建另一个树图,添加比较器,并使用旧地图将数据加载到新地图中,我觉得这是不必要的。
如果比较器类型不能序列化,是否可以用我的比较器创建一个空的树形图,并要求杰克逊映射器将PUT项放入其中?