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的序列化时 。当子类实现了序列化接口时,就只序列化子类,及属性,当子类没有实现序列化接口时,就要序列化子类,同时还要序列化实现了序列化接口的父类及属性,
?