读书人

java 序列化之当序列化遭遇沿袭,组合

发布时间: 2012-09-16 17:33:17 作者: rapoo

java 序列化之当序列化遭遇继承,组合,对象引用

public class Serial extends SerializableEr implements Serializable{    private static final Logger LOG = Logger.getLogger(Serial.class);    int id;String name;private static final Test test =new Test();public Serial(int id, String name) {this.id = id;this.name = name;}public String toString() {return "DATA: " + id + " " +name+super.test;}public static void main(String[] args) throws Exception{        Serial serial=new Serial(1,"4234");        System.out.println("object serial:"+serial);         try{            FileOutputStream fos=new FileOutputStream("serialTest.txt");             ObjectOutputStream oos=new ObjectOutputStream(fos);             oos.writeObject(serial);             oos.flush();             oos.close();         }catch(Exception e){            System.out.println("Exception:"+e);         }        a();    }  public static void a()throws Exception{      FileInputStream fos=new FileInputStream("serialTest.txt");       ObjectInputStream oos=new ObjectInputStream(fos);       Object o=  oos.readObject();      System.out.println(o);  }

?

public class Test {   }

?

?

public class SerializableEr {        Test test =new Test();   // public SerializableEr(){};}

?

运行结果:object serial:DATA: 1 4234ser.Test@9971ad
DATA: 1 4234ser.Test@1bf6770
当把? Serial? 改为 private static final Test test =new Test();

public class Serial extends SerializableEr implements Serializable{    private static final Logger LOG = Logger.getLogger(Serial.class);    int id;String name;/*private static final*/ Test test =new Test();public Serial(int id, String name) {this.id = id;this.name = name;}public String toString() {return "DATA: " + id + " " +name+super.test;}public static void main(String[] args) throws Exception{        Serial serial=new Serial(1,"4234");        System.out.println("object serial:"+serial);         try{            FileOutputStream fos=new FileOutputStream("serialTest.txt");             ObjectOutputStream oos=new ObjectOutputStream(fos);             oos.writeObject(serial);             oos.flush();             oos.close();         }catch(Exception e){            System.out.println("Exception:"+e);         }        a();    }  public static void a()throws Exception{      FileInputStream fos=new FileInputStream("serialTest.txt");       ObjectInputStream oos=new ObjectInputStream(fos);       Object o=  oos.readObject();      System.out.println(o);  }}

???

object serial:DATA: 1 4234ser.Test@9971adException:java.io.NotSerializableException: ser.TestException in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Testat java.io.ObjectInputStream.readObject0(Unknown Source)at java.io.ObjectInputStream.defaultReadFields(Unknown Source)at java.io.ObjectInputStream.readSerialData(Unknown Source)at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)at java.io.ObjectInputStream.readObject0(Unknown Source)at java.io.ObjectInputStream.readObject(Unknown Source)at ser.Serial.a(Serial.java:40)at ser.Serial.main(Serial.java:35)Caused by: java.io.NotSerializableException: ser.Testat java.io.ObjectOutputStream.writeObject0(Unknown Source)at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)at java.io.ObjectOutputStream.writeSerialData(Unknown Source)at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)at java.io.ObjectOutputStream.writeObject0(Unknown Source)at java.io.ObjectOutputStream.writeObject(Unknown Source)at ser.Serial.main(Serial.java:29)

?总结:

? 事实证明。

?1:java的序列化时 。只是序列化jvm堆上的对象以及属性对象,,像静态变量就可以不实现序列化接口,因为静态变量在存在与方法区的,

场景2:

public class Serial extends SerializableEr {    private static final Logger LOG = Logger.getLogger(Serial.class);    int id;String name;private static final Test test =new Test();public Serial(int id, String name) {this.id = id;this.name = name;}public String toString() {return "DATA: " + id + " " +name+super.test;}public static void main(String[] args) throws Exception{        Serial serial=new Serial(1,"4234");        System.out.println("object serial:"+serial);         try{            FileOutputStream fos=new FileOutputStream("serialTest.txt");             ObjectOutputStream oos=new ObjectOutputStream(fos);             oos.writeObject(serial);             oos.flush();             oos.close();         }catch(Exception e){            System.out.println("Exception:"+e);         }        a();    }  public static void a()throws Exception{      FileInputStream fos=new FileInputStream("serialTest.txt");       ObjectInputStream oos=new ObjectInputStream(fos);       Object o=  oos.readObject();      System.out.println(o);  }}

?

public class SerializableEr implements Serializable{        Test test =new Test();   // public SerializableEr(){};}

? 结果:

object serial:DATA: 1 4234ser.Test@9971adException:java.io.NotSerializableException: ser.TestException in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Testat java.io.ObjectInputStream.readObject0(Unknown Source)at java.io.ObjectInputStream.defaultReadFields(Unknown Source)at java.io.ObjectInputStream.readSerialData(Unknown Source)at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)at java.io.ObjectInputStream.readObject0(Unknown Source)at java.io.ObjectInputStream.readObject(Unknown Source)at ser.Serial.a(Serial.java:40)at ser.Serial.main(Serial.java:35)Caused by: java.io.NotSerializableException: ser.Testat java.io.ObjectOutputStream.writeObject0(Unknown Source)at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)at java.io.ObjectOutputStream.writeSerialData(Unknown Source)at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)at java.io.ObjectOutputStream.writeObject0(Unknown Source)at java.io.ObjectOutputStream.writeObject(Unknown Source)at ser.Serial.main(Serial.java:29)

?

?

?

?2:java的序列化时 。当子类实现了序列化接口时,就只序列化子类,及属性,当子类没有实现序列化接口时,就要序列化子类,同时还要序列化实现了序列化接口的父类及属性,

?

读书人网 >编程

热点推荐