Java 如何在XStream中处理循环引用?

Java 如何在XStream中处理循环引用?,java,serialization,xml-serialization,xstream,Java,Serialization,Xml Serialization,Xstream,这些声明在即时序列化复杂Java对象(例如,不需要修改对象或映射)方面非常健壮。特别是,根据,XStream可以处理循环对象引用 因此,我编写了一个测试来验证这一点——我试图序列化一个有点复杂的数据结构(LinkedHashMultimap),其中包括对iteself的引用: import com.google.common.collect.LinkedHashMultimap; import com.thoughtworks.xstream.XStream; public class Ser

这些声明在即时序列化复杂Java对象(例如,不需要修改对象或映射)方面非常健壮。特别是,根据,XStream可以处理循环对象引用

因此,我编写了一个测试来验证这一点——我试图序列化一个有点复杂的数据结构(
LinkedHashMultimap
),其中包括对iteself的引用:

import com.google.common.collect.LinkedHashMultimap;
import com.thoughtworks.xstream.XStream;

public class SerializationTest {

    public static void main(String[] args0) {

        // Create LinkedHashMultimap to serialize
        LinkedHashMultimap<String, Object> outObj = LinkedHashMultimap.create();
        outObj.put("x", 1);
        outObj.put("x", "abc");
        outObj.put("y", outObj);   // Add a self-reference

        // Try to serialize
        XStream xstream = new XStream();
        String xml = xstream.toXML(outObj);
        System.out.println(xml);  // Print XML to console for a quick peek

        // Try to deserialize - ERROR HERE!!!
        LinkedHashMultimap<String, Object> inObj = (LinkedHashMultimap<String, Object>)xstream.fromXML(xml);

        System.out.println(inObj);
    }
}
那么有人知道为什么会发生这种情况吗?如何解决这个问题?

使用:

XStream xstream = new XStream();
xstream.setMode(XStream.XPATH_RELATIVE_REFERENCES);

老兄,你还在吗?告诉我你是如何解决这个问题的。使用xstream.setMode(xstream.XPATH\u RELATIVE\u REFERENCES);
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: Could not call com.google.common.collect.LinkedHashMultimap.readObject() : null
---- Debugging information ----
message             : Could not call com.google.common.collect.LinkedHashMultimap.readObject()
cause-exception     : java.lang.NullPointerException
cause-message       : null
class               : com.google.common.collect.LinkedHashMultimap
required-type       : com.google.common.collect.LinkedHashMultimap
converter-type      : com.thoughtworks.xstream.converters.reflection.SerializableConverter
path                : /com.google.common.collect.LinkedHashMultimap/com.google.common.collect.LinkedHashMultimap
line number         : 15
version             : 1.4.7
-------------------------------
    at com.thoughtworks.xstream.converters.reflection.SerializationMethodInvoker.callReadObject(SerializationMethodInvoker.java:119)
    at com.thoughtworks.xstream.converters.reflection.SerializableConverter.doUnmarshal(SerializableConverter.java:454)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:257)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
Disconnected from the target VM, address: '127.0.0.1:50107', transport: 'socket'
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1185)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1169)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1040)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1031)
    at SerializationTest3.main(SerializationTest3.java:18)
Caused by: java.lang.NullPointerException
    at com.google.common.collect.AbstractMapBasedMultimap$AsMap.hashCode(AbstractMapBasedMultimap.java:1289)
    at com.google.common.collect.AbstractMultimap.hashCode(AbstractMultimap.java:228)
    at com.google.common.collect.LinkedHashMultimap.hashCode(LinkedHashMultimap.java:81)
    at com.google.common.collect.Hashing.smearedHash(Hashing.java:51)
    at com.google.common.collect.LinkedHashMultimap$ValueSet.add(LinkedHashMultimap.java:416)
    at com.google.common.collect.LinkedHashMultimap.readObject(LinkedHashMultimap.java:574)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.thoughtworks.xstream.converters.reflection.SerializationMethodInvoker.callReadObject(SerializationMethodInvoker.java:113)
    ... 13 more
XStream xstream = new XStream();
xstream.setMode(XStream.XPATH_RELATIVE_REFERENCES);