#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));