杰克逊多个串行器哪一个使用?

时间:2017-05-23 14:32:12

标签: java json serialization jackson

我正在使用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>

1 个答案:

答案 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中,其输入类型为键。严格来说,不能保证将来不会改变,因为这都是内部实施。