1

我正在用 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 解决这种情况的任何建议?还是我应该使用其他技术?

4

1 回答 1

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);
    }
}
于 2012-08-23T12:57:42.573 回答