Java 能否将XStream配置为具有双向(父/子)引用?
我正在使用XStream加载一个结构如下的文件:Java 能否将XStream配置为具有双向(父/子)引用?,java,xstream,Java,Xstream,我正在使用XStream加载一个结构如下的文件: <parent> <child/> <child/> </parent> public class Parent(){ private List<Child> children; } public class Child { private Parent parent; } 进入这样一个类: <parent> <child/> &
<parent>
<child/>
<child/>
</parent>
public class Parent(){
private List<Child> children;
}
public class Child {
private Parent parent;
}
进入这样一个类:
<parent>
<child/>
<child/>
</parent>
public class Parent(){
private List<Child> children;
}
public class Child {
private Parent parent;
}
公共类父类(){
私人名单儿童;
}
公营儿童{
私人家长;
}
我希望能够做到这一点:parent.getChildren().get(0.getParent()
我希望能够按原样使用XML。我知道我可以在children下面添加对父母的引用,但这似乎是多余的。我知道孩子的父母是因为它的XML结构
XStream是否支持此功能?是XStream支持反向链接以避免循环引用。默认情况下,它会这样做,但需要这样做的消息是否真的合适还存在争议。只需在网络上传输一些数据就可以了,但它实际上不是一条“消息”,更像是一个序列化对象
你的子对象需要有一个指向父的指针。
如果你愿意考虑使用XFSUW以外的其他东西,那么很容易用(我是MOXY技术领导)处理双向属性。 您的对象模型将映射为:import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Parent {
private List<Child> children;
@XmlElement(name="child")
public List<Child> getChildren() {
return children;
}
public void setChildren(List<Child> children) {
this.children = children;
}
}
演示代码如下所示(input.xml指问题中的xml):
要将MOXy指定为JAXB实现,您需要在与模型类相同的包中包含一个名为JAXB.properties的文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
下面是我比较JAXB和XStream的链接:
readResolve
来设置反向引用。根据XStream常见问题解答,这将以与标准库序列化相同的方式调用:
调用readResolve
时,父级
及其所有子级将已经反序列化,因此您可以在那时设置backreference
public class Parent {
private List<Child> children = new ArrayList<Child>();
private Object readResolve() {
for( Child child: children ) {
child.setParent(this);
}
return this;
}
}
公共类父类{
private List children=new ArrayList();
私有对象readResolve(){
用于(儿童:儿童){
child.setParent(this);
}
归还这个;
}
}
我同意您的看法,即这可能不是一个好主意,但我是在一些外部约束下运营的。所以公共类子类{private Parent;}
。XStream是否会自动填充此内容?我需要设置什么样的XStream注释或配置来处理这个问题?如果在封送对象时设置了引用,那么在取消封送对象时就会设置引用。这只是碰巧。你试过了吗?这是我通常看到他们工作的方式!不需要很长时间:System.out.println(新的XStream().toXML(父级));我序列化的XML的格式与我给出的示例类似。那么我会被迫将其重新格式化为
?这似乎是多余的,父对象应该可以通过其位置来定义。您的答案可能是更好的路径,但是这个项目被锁定在XStream中。