java - 使用 XStream 创建不同对象的列表

标签 java xml tree xstream xml-deserialization

我正在用 Java 创建一个程序,其中包含对象的树结构。所有涉及的类都实现相同的接口(interface),并且每个类都包含一个子级列表:

public class MyClass1 implements MyInterface {    
    List<MyInterface> children;
}

public class MyClass2 implements MyInterface {    
    List<MyInterface> children;
}

public class MyClass3 implements MyInterface {    
    List<MyInterface> children;
}

....

现在这三个结构已在 XML 文件中定义:

<myclass1>
    <myclass2></myclass2>
    <myclass1>
        <myclass3></myclass3>
    </myclass1>
</myclass1>

树结构可以是任何类型,由用户定义。当然,每个类都包含特定于类的变量,我现在省略了。

现在我尝试使用 XStream 将 XML 文件反序列化为 Java 对象,最好使用注释,但我不知道如何执行此操作。我不想最终为每个可能的类别列出一个列表,例如在 MyClass1 中:

@XStreamImplicit(itemFieldName="myclass2")
List<MyClass2> children2;
@XStreamImplicit(itemFieldName="myclass3")
List<MyClass3> children3;
@XStreamImplicit(itemFieldName="myclass4")
List<MyClass4> children4;

关于如何使用 XStream 解决此案例有什么建议吗?或者我应该使用其他技术?

最佳答案

source.xml(包含我们要加载的 XML):

<myclass1>
    <myclass2></myclass2>
    <myclass1>
        <myclass3></myclass3>
    </myclass1>
</myclass1>

界面:

import java.util.List;

public interface Myinterface {
    List<? extends Myinterface> getChildren();
}    

抽象 bean 类(使用 @XStreamImplicit 声明子级):

import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamImplicit;

public class MyAbstract implements Myinterface {
    @XStreamImplicit
    private List<? extends Myinterface> children = new ArrayList<Myinterface>();


    public List<? extends Myinterface> getChildren() {
        return children;
    }
}

Bean 类(扩展 MyAbstract,使用 @XStreamAlias 来使用您需要的 XML 字符串):

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias(value="myclass1")
public class Myclass1 extends MyAbstract {

}

@XStreamAlias(value="myclass2")
public class Myclass2 extends MyAbstract {

}

@XStreamAlias(value="myclass3")
public class Myclass3 extends MyAbstract {

}

主类(读取 XML 源文件。不要忘记 processAnnotations 从带注释的类加载配置):

import com.thoughtworks.xstream.XStream;

public class XStreamTest {
    public static void main(String[] args) {
        XStream xStream = new XStream();
        xStream.processAnnotations(Myclass1.class);
        xStream.processAnnotations(Myclass2.class);
        xStream.processAnnotations(Myclass3.class);

        Object fromXML = xStream.fromXML(XStreamTest.class.getResourceAsStream("source.xml"));
        System.out.println(fromXML);
    }
}

关于java - 使用 XStream 创建不同对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12091574/

相关文章:

java - Intellij 找不到类 'android.app.Notification$Builder'

java - 玩!框架日志记录仅适用于系统级别

regex - 这个 XSD 正则表达式有意义和/或 POSIX 兼容吗?

javascript - 如何使用 REGEXP 就地反转字符串中的这些单词?

java - Java中基于ArrayList的二叉树实现

Java 泛型 : <B extends BaseB> does not match <? 扩展 BaseB>

java - 是否有任何数据结构提供快速键/值访问,但它也是有序的并且可以通过位置索引访问?

c++ - c++中的atof、结构和指针

java - 如何解析从客户端收到的xml结果

java - xsd 类型定义可以引用 xml 文件本身吗?