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