Сериализация неизменяемой карты с помощью Jackson

#java #serialization #jackson #immutables-library

#java #сериализация #джексон #неизменяемые-библиотека

Вопрос:

Я пытаюсь сериализовать ImmutableMap<Dummy, DummyInfo> с помощью Jackson. Пользовательский сериализатор написан специально для фиктивного класса. Поведение по умолчанию подходит для всего остального. Он отлично работает для фиктивного класса, но не для объекта ImmutableMap.

Класс сериализатора:

 public class DummySerializer extends StdSerializer<Dummy> {
    private final ObjectMapper mapper = new ObjectMapper();

    protected DummySerializer(Class<Dummy> t) {
        super(t);
    }

    @Override
    public void serialize(Dummy dummyObj,
                          JsonGenerator gen,
                          SerializerProvider serializers)
            throws IOException {

        StringWriter writer = new StringWriter();
        mapper.writeValue(writer, dummyObj.getDummyId());
        gen.writeFieldName(writer.toString());
    }
}
  

Использование:

 ImmutableMap<Dummy, DummyInfo> map = //initialization
SimpleModule module = new SimpleModule();
module.addSerializer(new DummySerializer(Dummy.class));
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
mapper.writeValueAsString(map);
  

Вместо просмотра указанной сериализации выводится строка по умолчанию для ImmutableMap.

Комментарии:

1. Вы пробовали зарегистрироваться GuavaModule , jackson-datatypes-guava чтобы Джексон знал, как обращаться с ImmutableMap? github.com/FasterXML/jackson-datatypes-collections/tree/master /…

Ответ №1:

Использование addKeySerializer вместо addSerializer решило проблему.

 SimpleModule module = new SimpleModule();
module.addKeySerializer(new DummySerializer(Dummy.class));