我有一个XStream用于克隆。这是我的简单代码,我对它没有太多的专业知识。
com.thoughtworks.xstream.XStream XSTREAM = new com.thoughtworks.xstream.XStream();
之后,我将克隆实例存储在hashTable中(我知道存储在上面不是一个好主意,但这是一个遗留系统)。
我将它存储为Student类,然后存储(克隆)Student的另一个实例并引发。
com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Could not call com.model.Student_$$_javassist_83.writeReplace():null java.lang.NullPointerException
下面是我存储克隆对象的代码。
public void keep(String key, Object value)
{
Object obj = XSTREAM.fromXML(XSTREAM.toXML(value));
storage.put(key,obj);
}
我认为这里是源代码的问题出现。(XStream来源。)(片段)
public Object callWriteReplace(Object object)
{
Method writeReplaceMethod = getMethod(object.getClass(), "writeReplace", null, true);
if (writeReplaceMethod != null) {
try {
Object[] EMPTY_ARGS = new Object[0];
return writeReplaceMethod.invoke(object, EMPTY_ARGS);
} catch (IllegalAccessException e) {
throw new ObjectAccessException("Could not call " + object.getClass().getName() + ".writeReplace()", e);
} catch (InvocationTargetException e) {
throw new ObjectAccessException("Could not call " + object.getClass().getName() + ".writeReplace()", e.getTargetException());
}
} else {
return object;
}
}
我希望有人能给我指路,在这个话题上我有点迷路了。
这是跟踪。似乎当我清理了clazz示例student.setListOfPhones(null)
的依赖项时,它工作了;例外情况出现在图中的第2或第3层。为什么根据XStream,它说:
使其适合大型对象图或具有高消息吞吐量的系统。
堆栈跟踪:
com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Could not call com.model.Subjects_$$_javassist_224.writeReplace() : null
java.lang.NullPointerException
at javassist.util.proxy.RuntimeSupport$DefaultMethodHandler.invoke(RuntimeSupport.java:37)
at com.model.Subjects_$$_javassist_224.writeReplace(Subject_$$_javassist_224.java)
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.callWriteReplace(SerializationMethodInvoker.java:88)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:60)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller$1.convertAnother(AbstractReferenceMarshaller.java:84)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshallField(AbstractReflectionConverter.java:229)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.writeField(AbstractReflectionConverter.java:208)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.<init>(AbstractReflectionConverter.java:171)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:116)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:72)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller$1.convertAnother(AbstractReferenceMarshaller.java:84)
嗨,我已经解决了这个问题是另一种方法是在这个类学生上创建一个浅拷贝,当然,当XStream得到这个类时,XStream的关系不够深,NullPointerException被抛出。谢谢戴夫,上帝保佑。