3

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

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

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

4

1 回答 1

4

首先,您的问题实际上是两个不相关的问题,我会尽力回答它们。

转换器

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

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

可以使用明确的优先级注册转换器。默认情况下,它们使用 XStream.PRIORITY_NORMAL 注册。相同优先级的转换器将按其注册的相反顺序使用。默认转换器,即如果没有其他已注册的转换器适用时将使用的转换器,可以使用优先级 XStream.PRIORITY_VERY_LOW 进行注册。XStream 默认使用 ReflectionConverter 作为后备转换器。

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

转换器查找

要回答如何使用您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并实现's。MapperWrapper(查看buildMapper内部XStream.java以查看一些默认值)像这样初始化:

    ClassLoader classLoader = new ClassLoaderReference(new CompositeClassLoader());
    Mapper mapper = new DefaultMapper(classLoader);
    mapper = new MyOwnMapperWrapper(mapper);
    XStream xs = new XStream(null, mapper, new XppDriver());
于 2013-01-23T19:29:10.510 回答