确保对象的序列化操作正确 [英] Ensuring that the serialization of an object is done correctly

查看:139
本文介绍了确保对象的序列化操作正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法,以确保对象的序列化是正确的呢?
我创建了以的writeObject()方法序列化一个小程序,我没有异常没有错误。
但是,当我尝试使用的readObject反序列化它()我得到一个NullPointerException异常。
我的小程序是有点复杂,但我保证我所有的领域都是可序列化。

类异议的嵌套类。

任何猜测,可能发生什么?

在code以下是我的servlet它会创建一个SerialTree。

 `SerialTree ST =新SerialTree();     尝试{
        ObjectOutputStream的出=新的ObjectOutputStream(新的FileOutputStream(/家庭/ COF / test8)); out.writeUnshared(ST);
 了out.flush();
 out.close();

}

下面的堆栈跟踪:


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

下面的线70到106的小应用程序本身,它会尝试检索serilaTree对象?

`
尝试{
    结果=新的ObjectInputStream(新的FileInputStream(/家庭/ COF / test8));

 }
 赶上(NotSerializableException E){     e.printStackTrace();
 } 赶上(InvalidClassException E){
     e.printStackTrace();
 }
 赶上(StreamCorruptedException E){     e.printStackTrace();
 }
 赶上(NotActiveException的构造方法E){     e.printStackTrace();
 }
 赶上(OptionalDataException E){     e.printStackTrace();
 }obj对象= NULL;    尝试{物镜= result.readObject();    }
    赶上(NullPointerException异常五){     e.printStackTrace();
    //的System.out.println(LALAL);
 }
 赶上(NotSerializableException E){     e.printStackTrace();
 }
 赶上(InvalidClassException E){     e.printStackTrace();
 }
 赶上(StreamCorruptedException E){     e.printStackTrace();
 }


解决方案

对我来说,没有任何意义SER / deser类型的小程序。尝试使用不同的类。

更新:
我读过你的堆栈跟踪,和我看到的是,你试图反序列化一个小程序在运行的小程序。我强烈怀疑这是你的问题的原因。尝试所有的变量移动到不同的类(称之为 MySerializableApplet 例如,不要让它扩展类 Applet的),那么仅这一项操作你的序列化/反序列化。

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. But when I try to de-serialize it with readObject() I got a 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 .

` 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 :

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 ?

` 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. 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.

这篇关于确保对象的序列化操作正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆