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

时间:2012-08-23 12:26:13

标签: java xml tree xstream xml-deserialization

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

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解决此案例的任何建议?或者我应该使用其他技术?

1 个答案:

答案 0 :(得分:0)

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);
    }
}