杰克逊:如果有多个串行器,则使用哪一个?

马赛尔

我正在使用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>
亨里克·阿斯特德·索伦森

在理想的世界中,的Javadoc中会明确指定类似这样的内容SimpleModule,但是不幸的是,这里似乎并非如此。

第二好的方法是查看源代码,它揭示了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以输入类型作为键存储在中严格来讲,不能保证将来不会改变,因为它全部是内部实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有关逗号杰克逊CSV解析器扼流圈分隔值的文件,如果“”是一个域,即使使用引号“

杰克逊无法使用一个参数构造器构造实例

如果有多个远程源,如何仅删除一个远程源?

如果有多个用户,如何使Windows自动登录到一个用户?

如果有多个类实现一个接口,那么@autowired怎么工作?

如果有多个相同类类型的按钮,Puppeteer 如何指定一个按钮?

杰克逊解串器委托给一个适用的解串器

杰克逊库1.x数组,如果一个元素有时只是一个字符串

解析JSON使用杰克逊:我们可以在一个POJO可选变量

使用杰克逊从json数组中检索一个值

角4:如果有多个具有相同选择器的组件,如何根据某些条件仅加载一个组件?

是否有一个具有多个根节点的树结构,如果有,它叫什么?

如果有一个或多个匹配元素,则将其添加到xsl变量中

python中是否有一个not或only函数,如果有,它将如何使用?

python中是否有一个not或only函数,如果有,它将如何使用?

杰克逊:当调用不同的Rest EndPoint时,同一实体上有多个序列化器

多个#ifndef语句-应用哪一个

Python - 多个 OR 语句,触发了哪一个?

正则表达式替换一个字符,但如果有多个,则仅替换第一个

如果有多个单词,则提取逗号后字符串中的最后一个单词,否则第一个单词

灿杰克逊反序列化使用它没写一个布尔JSON财产的具体subsclass?

使用Rubberduck单元测试,如何找出多个断言中的哪一个失败?

如果领先的驼峰式案例单词只有一个字母长,为什么杰克逊2无法识别第一个大写字母?

如果有一个线程,异步任务如何说它们“完成”了?

如果有一个公用密钥,如何求和json数组密钥的值

将指针传递到向量的第一个元素(如果有)

ImageJ脚本:如果有一个,则“此命令需要选择”

如果有一个选项,如何禁用选择下拉菜单?

如果有一个空单元格,VBA 不起作用