【问题标题】:How does XStream select its converters?XStream 如何选择它的转换器?
【发布时间】:2016-08-26 00:35:34
【问题描述】:

我能找到的关于 XStream 转换器的唯一文档在这两个页面上:

当 XStream 解析 XML 输入时,它使用ConverterLookup(默认为DefaultConverterLookup)来查找要按类使用的转换器。我想将我的XStream 映射器配置为使用我自己的自定义ConverterLookup,但只能看到getConverterLookup() 方法,而不是相应的setter。

我有一个实例,其中 XStream 在 XML 中遇到 Date 值,并使用相应的 DateConverter 返回。我希望它使用不同的转换器,这(我相信)意味着我需要设置/注册我自己的Converter impl。只是无法弄清楚如何做到这一点。提前致谢。

【问题讨论】:

    标签: java converter xstream


    【解决方案1】:

    首先你的问题其实是两个不相关的问题,我会尽力回答。

    转换器

    关于日期转换的第二个问题。在我看来,这似乎就是你在这里的原因。

    添加自己的转换器的基本方法相当简单,方法registerConverter 应该会给你一个线索。如果您想知道如何实现Converter,我建议您查看 XStream 已经提供的众多转换器之一。另外,我觉得我必须提到转换器的优先级。

    可以使用明确的优先级注册转换器。经过 默认它们使用 XStream.PRIORITY_NORMAL 注册。转换器 相同优先级的将按相反的顺序使用 挂号的。默认转换器,即将成为的转换器 如果没有其他已注册的转换器适用,则可以使用,可以注册 优先 XStream.PRIORITY_VERY_LOW。 XStream 默认使用 ReflectionConverter 作为后备转换器。

    换句话说,给定两个接受相同类的转换器,将使用最后添加的那个。

    ConverterLookup

    要回答如何使用ConverterLookup,有两种方法可能会产生相同的结果,我个人会选择替代方法 2。

    1) 覆盖getConverterLookup

        XStream xs = new XStream(){
            @Override
            public ConverterLookup getConverterLookup() {
                return new ConverterLookup() {
    
                    public Converter lookupConverterForType(Class type) {
                        //Do your magic here
                    }
                };
            }
        };
    

    2) 使用Mapper

    在这种情况下,我会保留DefaultMapper,而是为我的新映射实现MapperWrapper。 (查看XStream.java 内部的buildMapper 以查看一些默认值)像这样初始化:

        ClassLoader classLoader = new ClassLoaderReference(new CompositeClassLoader());
        Mapper mapper = new DefaultMapper(classLoader);
        mapper = new MyOwnMapperWrapper(mapper);
        XStream xs = new XStream(null, mapper, new XppDriver());
    

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      相关资源
      最近更新 更多