java父类序列化_父类的序列化与 Transient 关键字
情境:一個子類實現(xiàn)了 Serializable 接口,
它的父類都沒有實現(xiàn) Serializable 接口,
序列化該子類對象,
然后反序列化后輸出父類定義的某變量的數(shù)值,該變量數(shù)值與序列化時的數(shù)值不同。
解決:
要想將父類對象也序列化,就需要讓父類也實現(xiàn)Serializable 接口。
如果父類不實現(xiàn)的話的,就?需要有默認的無參的構(gòu)造函數(shù)。
在父類沒有實現(xiàn) Serializable 接口時,虛擬機是不會序列化父對象的,
而一個 Java 對象的構(gòu)造必須先有父對象,才有子對象,反序列化也不例外。
所以反序列化時,為了構(gòu)造父對象,只能調(diào)用父類的無參構(gòu)造函數(shù)作為默認的父對象。
因此當我們?nèi)「笇ο蟮淖兞恐禃r,它的值是調(diào)用父類無參構(gòu)造函數(shù)后的值。
如果你考慮到這種序列化的情況,在父類無參構(gòu)造函數(shù)中對變量進行初始化,
否則的話,父類變量值都是默認聲明的值,如 int 型的默認是 0,string 型的默認是 null。
也就是說,要為一個沒有實現(xiàn)Serializable接口的父類,編寫一個能夠序列化的子類要做兩件事情:
其一、父類要有一個無參的constructor;
其二、子類要負責序列化(反序列化)父類的域。
public abstract class SuperC {
int supervalue;
public SuperC(int supervalue) {
this.supervalue = supervalue;
}
public SuperC(){}//增加一個無參的constructor
public String toString() {
return "supervalue: "+supervalue;
}
}
public class SubC extends SuperC implements Serializable {
int subvalue;
public SubC(int supervalue,int subvalue) {
super(supervalue);
this.subvalue=subvalue;
}
public String toString() {
return super.toString()+" sub: "+subvalue;
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException{
out.defaultWriteObject();//先序列化對象
out.writeInt(supervalue);//再序列化父類的域
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException{
in.defaultReadObject();//先反序列化對象
supervalue=in.readInt();//再反序列化父類的域
}
}
Transient 關鍵字的作用是控制變量的序列化,
在變量聲明前加上該關鍵字,可以阻止該變量被序列化到文件中,
在被反序列化后,transient 變量的值被設為初始值,如 int 型的是 0,對象型的是 null。
總結(jié)
以上是生活随笔為你收集整理的java父类序列化_父类的序列化与 Transient 关键字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java csf_WebService
- 下一篇: 中国第一批写java的人_中国java开