Java TreeMap比较器未使用杰克逊映射器序列化

时间:2018-07-21 00:42:13

标签: java serialization jackson

我有一个比较器来解析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项放入其中?

0 个答案:

没有答案