Обход стирания типа времени выполнения для универсального сериализатора карт

Я работаю над сериализатором для Map<K,V>, который сериализует записи карты в виде массива объектов JSON, где key и value могут содержать произвольные типы (включая сложные типы для ключей). У меня есть

public class MapEntryDeserializer<K,V> extends StdDeserializer<Map<K,V>> {
    private static final long serialVersionUID = 1L;

    public MapEntryDeserializer(Class<Map<K,V>> vc) {
        super(vc);
    }

    public MapEntryDeserializer(JavaType valueType) {
        super(valueType);
    }

    @Override
    public Map<K, V> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        Map<K,V> retValue = new HashMap<>();
        List<Entry<K,V>> entries = p.readValueAs(new TypeReference<List<Entry<K,V>>>() {});
        for(Entry<K,V> entry : entries) {
            retValue.put(entry.getKey(),
                    entry.getValue());
        }
        return retValue;
    }

    private static class Entry<K,V> {
        private K key;
        private V value;

        public Entry() {
        }

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }
    }
}

который работает, за исключением new TypeReference<List<Entry<K,V>>>, который разрешается в List<Entry<Object, Object>> во время выполнения и, таким образом, вложенные Entity2s должны быть десериализованы как Map.

{
  "id" : 1,
  "valueMap" : [ {
    "key" : {
      "type" : "richtercloud.jackson.map.custom.serializer.Entity2",
      "id" : 2
    },
    "value" : 10
  } ]
}

Итак, мне интересно, есть ли способ достичь общего решения, например. пройти Class<? extends K> и Class<? extends V> и построить JavaType с TypeFactory.constructParametricType.

Я использую Джексон 2.9.4.


person Karl Richter    schedule 10.03.2018    source источник
comment
Я уверен, что это можно решить, предоставив JsonParser.readAsValue(ResolvedType), который кажется легко достижимым и который я предложил на github.com/FasterXML/jackson-databind/issues/1966.   -  person Karl Richter    schedule 11.03.2018
comment
Я попросил разъяснений, но afaiu в соответствии с github.com/FasterXML/jackson-databind/issues /1967 определенный вариант использования сериализации вообще не работает в течение длительного времени, и поэтому сбои могут происходить по причинам, не связанным с фактической причиной отсутствия поддержки, что может привести к огромной потере времени.   -  person Karl Richter    schedule 11.03.2018