我正在用 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/