【问题标题】:How to create an alias for a private inner class (using XStream)?如何为私有内部类创建别名(使用 XStream)?
【发布时间】:2011-01-12 08:28:43
【问题描述】:

我正在为长类名创建别名...它工作得非常好,但其中一个序列化类是私有内部类。除了公开之外,我想不出一种方法来为其创建别名。我不喜欢这个解决方案,因为它首先不应该是公开的。但是,由于为其创建别名,因此无需修改 XML 文件就可以更改包名和类名(因为第一个标签是完全限定的类名)。

这就是我创建别名的方式:

xstreamInstance.alias("ClassAlias", OuterClass.InnerClassToAlias.class);

这就是为什么我需要对该内部类进行公共访问。

所以,如果有人知道给私有内部类起别名的技巧,我真的很想听听。

【问题讨论】:

  • 我了解到XStream 有两种模式:Pure Java 和Enhanced。在增强模式下,XStream 接缝能够达到更多私有/内部/静态/等。成员比在纯 Java 模式下。但我相信,就我而言,我不能假设将运行我的代码的所有 JVM 都将受到 XStream 增强模式的支持(它取决于 JVM)。

标签: java alias xstream


【解决方案1】:

您可以创建一个如下所示的类,并将您对xstreamInstance 的引用传递给alias 方法。

public class Parent {
    public void alias(XStream x) {
        x.alias("Kiddie", Parent.Child.class);
    }

    private class Child {

    }
}

【讨论】:

  • 看起来是个好主意。谢谢你。所以我可以选择将类公开还是添加一个小方法......这个小方法非常有趣,因为它不允许做不应该发生的事情(比如从其他地方实例化那个内部类)。跨度>
  • 如果私人课程在您的控制之下,这将起作用。如何为不受控制的私有类定义别名,例如 java.util.Arrays$ArrayList?有什么想法吗?
  • 回答我自己的问题:获取相关类的实例并在实例上使用 getClass()。创意来自this post
【解决方案2】:

为别名使用注解怎么样?

public class Parent {
    @XStreamAlias("kiddie")
    private class Child {

    }
}

编辑:唉,在请求解析父类时,XStream 不支持解析嵌套类的注释。

【讨论】:

  • 对我不起作用。与上面示例的唯一区别是我的内部类是静态的(嵌套类)。
  • 我查看了 XStream 代码,确实它不会隐式解析嵌套类。
  • 内部类的注释在自动检测模式下被正确解析,但它有很多含义。见xstream.codehaus.org/annotations-tutorial.html#AutoDetect
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
相关资源
最近更新 更多