0

クローン用の 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)
4

1 に答える 1

1

こんにちは、別のメソッドがこのクラス Student で浅いコピーを作成していたという問題を解決しました。もちろん、XStream がクラスを取得したとき、関係は XStream に対して十分に深くなく、NullPointerException はスローでした..Dave God Bless に感謝します。

于 2013-05-10T11:14:34.767 に答える