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@9971ad
Exception:java.io.NotSerializableException: ser.Test
Exception in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Test
at 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.Test
at 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@9971ad
Exception:java.io.NotSerializableException: ser.Test
Exception in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Test
at 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.Test
at 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的序列化时 。当子类实现了序列化接口时,就只序列化子类,及属性,当子类没有实现序列化接口时,就要序列化子类,同时还要序列化实现了序列化接口的父类及属性,