简体   繁体   English

确保对象的序列化正确完成

[英]Ensuring that the serialization of an object is done correctly

Is there a way to ensure that the serialization of an object is done correctly? 有没有办法确保对象的序列化正确完成? I created an applet that I serialize with writeObject() method and I have no Exception no error. 我创建了一个用writeObject()方法进行序列化的小程序,并且没有异常,没有错误。 But when I try to de-serialize it with readObject() I got a NullPointerException. 但是,当我尝试使用readObject()对其进行反序列化时,出现了NullPointerException。 My applet is kinda complex but I ensured that all my fields are serializable. 我的小程序有点复杂,但是我确保我所有的字段都可以序列化。

The class of the objection have nested classes. 异议的类别具有嵌套的类别。

Any guess as to what could have happen? 关于会发生什么的任何猜测?

the code below is in my servlet it creates a SerialTree . 下面的代码在我的servlet中,它创建一个SerialTree。

` SerialTree st = new SerialTree() ;

     try{
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/home/cof/test8"));

 out.writeUnshared(st);
 out.flush();
 out.close();

} }

Here's the stacktrace : 这是stacktrace:

java.lang.NullPointerException at java.awt.Container.readObject(Container.java:3575) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1865) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1684) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340) at java.io.ObjectInputStream.access$300(ObjectInputStream.java:205) at java.io.ObjectInputStream$GetFieldImpl.readFields(ObjectInputStream.java:2125) at java.io.ObjectInputStream.readFields(ObjectInputStream.java:536) at java.awt.Container.readObject(Container.java:3560) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1865) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1684) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340) at java.io.ObjectInputStream.access$300(ObjectInputStream.java:205) at java.io.ObjectInputStream$GetFieldImpl.readFields(ObjectInputStream.java:2125) at java.io.ObjectInputStream.readFields(ObjectInputStream.java:536) at java.awt.Container.readObject(Container.java:3560) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1865) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1684) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340) at java.io.ObjectInputStream.access$300(ObjectInputStream.java:205) at java.io.ObjectInputStream$GetFieldImpl.readFields(ObjectInputStream.java:2125) at java.io.ObjectInputStream.readFields(ObjectInputStream.java:536) at java.awt.Container.readObject(Container.java:3560) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1865) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1684) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340) at java.io.ObjectInputStream.access$300(ObjectInputStream.java:205) at java.io.ObjectInputStream$GetFieldImpl.readFields(ObjectInputStream.java:2125) at java.io.ObjectInputStream.readFields(ObjectInputStream.java:536) at java.awt.Container.readObject(Container.java:3560) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1865) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1684) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340) at java.io.ObjectInputStream.access$300(ObjectInputStream.java:205) at java.io.ObjectInputStream$GetFieldImpl.readFields(ObjectInputStream.java:2125) at java.io.ObjectInputStream.readFields(ObjectInputStream.java:536) at java.awt.Container.readObject(Container.java:3560) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1865) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1684) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1963) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1887) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368) at arbre.ArbreClient.getHttpObject(ArbreClient.java:92) at arbre.ArbreClient.init(ArbreClient.java:123) at sun.applet.AppletPanel.run(AppletPanel.java:436) at java.lang.Thread.run(Thread.java:636)

here the lines 70 to 106 to the applet itself ,it tries to retrieve a serilaTree object ? 这是applet本身的第70至106行,它试图检索一个serilaTree对象?

` try{ result = new ObjectInputStream(new FileInputStream("/home/cof/test8")); `try {result = new ObjectInputStream(new FileInputStream(“ / home / cof / test8”));;

}
 catch(NotSerializableException e){

     e.printStackTrace();
 }

 catch(InvalidClassException e){
     e.printStackTrace();
 }
 catch(StreamCorruptedException e){

     e.printStackTrace();
 }
 catch(NotActiveException e){

     e.printStackTrace();
 }
 catch(OptionalDataException  e){

     e.printStackTrace();
 }

Object obj =null;

    try{

obj = result.readObject(); 

    }
    catch(NullPointerException e){

     e.printStackTrace();
    // System.out.println("lalal");
 }
 catch(NotSerializableException e){

     e.printStackTrace();
 }
 catch(InvalidClassException e){

     e.printStackTrace();
 }
 catch(StreamCorruptedException e){

     e.printStackTrace();
 }

To me, it doesn't make sense to ser/deser the type Applet. 对我来说,Sert / deser类型Applet没有意义。 Try using a different class. 尝试使用其他类。

Update: I have read your stacktrace, and what I see is that you tried to deserialize an applet while running an applet. 更新:我已经阅读了您的堆栈跟踪,看到的是您尝试在运行小程序时反序列化小程序。 I strongly suspect this to be the reason of your problem. 我强烈怀疑这是您遇到问题的原因。 Try moving all your variables into a different class (call it MySerializableApplet for example, and don't make it extend the class Applet ), then operate your serialisation/deserialization on this one only. 尝试将所有变量移到不同的类中(例如,将其称为MySerializableApplet ,并且不要使其扩展Applet类),然后仅对此序列进行序列化/反序列化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM