java - XStream 序列化和反序列化中的多态性

标签 java xstream

我有这些类(class):

@XStreamAlias("person")
public class PersonConfig {

    private AnimalConfig animalConfig;

}

public interface AnimalConfig {}

@XStreamAlias("dog");
public class DogConfig extend AnimalConfig {}

@XStreamAlias("cat");
public class CatConfig extend AnimalConfig {}

我希望能够用上面的类反序列化这个 xml:

<person>
    <dog/>
<person>

以及使用相同的类反序列化此 xml:

<person>
    <cat/>
<person>

因此在这两种情况下,PersonConfig 的字段 animalConfig 都会被填充。在第一个 XML 中有一个 DogConfig 实例,在第二个 XML 中有一个 CatConfig 实例。

这是否可以通过添加一些注释来实现?

最佳答案

看来 XStream 并不能让你轻松做到这一点。

您的问题类似于this one ,要求使用 XStream 管理类似 xsd:choice 的内容。

如果您不一定需要使用 XStream,JAXB 会让您轻松做到:

@XmlRootElement(name="person")
public class PersonConfig {

    private AnimalConfig animalConfig;

    @XmlElementRefs({
        @XmlElementRef(name="cat", type=CatConfig.class),
        @XmlElementRef(name="dog", type=DogConfig.class)
    })
    public AnimalConfig getAnimalConfig() {
        return animalConfig;
    }

    public void setAnimalConfig(AnimalConfig animalConfig) {
        this.animalConfig = animalConfig;
    }
}

经过一些研究,如果您选择使用 XmlAdapter,则可以避免为您的属性列出所有可用的类。 在 Blaise Doughan 链接中,示例使用抽象类,而不是接口(interface)。

编辑:

正如 Blaise Doughan 在其评论中所说,@XmlElementRef 更适合此目的。代码已相应更新。

关于java - XStream 序列化和反序列化中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11484532/

相关文章:

java - UnknownHostException java

java - 在运行时更改 JLabel 的文本和 JMenuItem 的状态

java - 如何使用 xstream 将 Hashmap 映射到 XML 中的键值属性

java - 将 XML 转换为 Java Map<String, Integer>

Java XStream 将 XML 转换为对象

java - Xstream 在解码时不维护子元素的顺序

java - 给定一个 java 类的 Web 服务架构

java - Struts 2 中的默认 Action 包

java - 用 Java 从文本文件生成 XML

java - Java 8 中的并行性