【问题标题】:XStream short dynamic aliasesXStream 短动态别名
【发布时间】:2010-11-25 05:46:30
【问题描述】:

我想为类设置短名称,现在我可以使用别名来实现

XStream x = new XStream();
x.alias("dic", Dic.class);

但是我必须为每个类手动定义别名,有没有办法将 xstream 配置为自动完成?

【问题讨论】:

    标签: java dynamic automation alias xstream


    【解决方案1】:

    我解决的方法是:

    1.- 当我创建 xstream 时,我会覆盖它的 wrapmapper 方法

    XStream xstream = new XStream() {
        @Override
        protected MapperWrapper wrapMapper(MapperWrapper next) {
            return new MyClassAliasingMapper(next);
        }
    };
    

    2.- 与

    public class MyClassAliasingMapper extends ClassAliasingMapper {
    
        public MyClassAliasingMapper(Mapper wrapped) {
            super(wrapped);
        }
    
        @Override
        public Class realClass(String elementName) {
            try {
                return <… your own class …>
            } catch (Exception e) {
                // do nothing we fall back on super's implementation
            }
            return super.realClass(elementName);
        }
    
        @Override
        public String serializedClass(Class type) {
            try {
                return <… your own element name …>
            } catch (Exception e) {
                // do nothing we fall back on super's implementation
            }
            return super.serializedClass(type);
        }
    }
    

    【讨论】:

      【解决方案2】:

      唯一的其他选择是使用XStream annotations

      package com.my.incredibly.long.package.name;
      
      @XStreamAlias("dic")
      public class Dic {
        ...
      

      然后,在您配置 XStream 的代码中:

      xstream.processAnnotations(Dic.class);
      // OR
      xstream.autodetectAnnotations(true);
      

      然而,问题在于,为了反序列化你的类,XStream 必须已经知道它们的别名,所以autodetectAnnotations(true) 不会有帮助,除非你能保证你会序列化类在反序列化之前。另外(这可能会或可能不会让您担心)您正在向对象引入显式 XStream 依赖项。

      我已经标记了我需要序列化的所有类(这里有几个选择:通过 XStream 或您自己的注释对它们进行注释;让它们实现标记接口;从特定包中获取所有类),自动检测它们加载并显式配置 XStream 实例以将它们别名为没有包名的类名。

      【讨论】:

      • 好主意,我什至可以在 domian 对象上使用 @Entity 的正则表达式替换,但是这一次对我不起作用,谢谢。
      【解决方案3】:

      在内部,XStream 使用其Mapper 接口来处理将类和字段映射到它们在 XML 中的相应名称。这个接口有大量的实现。 XStream 类本身可以在其构造函数中使用 Mapper。您可能想查看该类的源代码以查看它默认使用的 Mapper 实现,然后编写您自己的实现来自动为您执行别名。例如,ClassAliasingMapper 看起来很有用。

      【讨论】:

      • 如果您有一种独特的双向方式将类映射到别名(例如,如果所有映射的类都在同一个已知包中),那将非常有用。否则,这只会​​增加另一层间接性,因为您仍然需要告诉映射器如何将别名映射到类。不过,我将它应用到我的场景中 - 这对于 OP 的情况可能很好。
      • 我只需要将对象(不是我的)转换为 xml,所以这可能会很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多