我正在使用com.fasterxml.jackson来序列化POJO。 我为字符串值编写了一个自定义序列化程序,它工作正常。 但是,我不确定当两个序列化程序注册相同类型时会发生什么。在我的测试中,添加了最后一个,但我不确定它是否一直以这种方式工作。
所以我的问题是:如果我为同一类型添加多个序列化程序,将使用哪一个?
代码段:
objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(new CustomSerializer1());
module.addSerializer(new CustomSerializer2());
...
class CustomSerializer1 extends NonTypedScalarSerializerBase<String>
class CustomSerializer2 extends NonTypedScalarSerializerBase<String>
答案 0 :(得分:1)
在一个理想的世界中,SimpleModule
的Javadoc中会清楚地指明这样的事情,但不幸的是,这似乎并非如此。
下一个最佳方法是查看源代码,该代码显示SimpleModule
使用类SimpleSerializers
来跟踪其配置的序列化程序。
潜入其中会显示_addSerializer
方法:
protected void _addSerializer(Class<?> cls, JsonSerializer<?> ser)
{
ClassKey key = new ClassKey(cls);
// Interface or class type?
if (cls.isInterface()) {
if (_interfaceMappings == null) {
_interfaceMappings = new HashMap<ClassKey,JsonSerializer<?>>();
}
_interfaceMappings.put(key, ser);
} else { // nope, class:
if (_classMappings == null) {
_classMappings = new HashMap<ClassKey,JsonSerializer<?>>();
}
_classMappings.put(key, ser);
if (cls == Enum.class) {
_hasEnumSerializer = true;
}
}
}
结论与您已经达到的结论相同:使用最后添加的序列化程序,因为它们存储在Map
中,其输入类型为键。严格来说,不能保证将来不会改变,因为这都是内部实施。