Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 能否将XStream配置为具有双向(父/子)引用?_Java_Xstream - Fatal编程技术网

Java 能否将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/> &

我正在使用XStream加载一个结构如下的文件:

<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中。