日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java继承序列化_java中序列化之子类继承父类序列化

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java继承序列化_java中序列化之子类继承父类序列化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當一個父類實現Serializable接口后,他的子類都將自動的實現序列化。

以下驗證了這一點:

package?Serial;

import?java.io.Serializable;

public?class?SuperC?implements?Serializable?{//父類實現了序列化

int?supervalue;

public?SuperC(int?supervalue)?{

this.supervalue?=?supervalue;

}

public?String?toString()?{

return?"supervalue:?"+supervalue;

}

}

public?class?SubC?extends?SuperC?{//子類

int?subvalue;

public?SubC(int?supervalue,int?subvalue)?{

super(supervalue);

this.subvalue=subvalue;

}

public?String?toString()?{

return?super.toString()+"?sub:?"+subvalue;

}

}

public?class?Test1?{

public?static?void?main(String?[]?args){

SubC?subc=new?SubC(100,200);

FileInputStream?in=null;

FileOutputStream?out=null;

ObjectInputStream?oin=null;

ObjectOutputStream?oout=null;

try?{

out?=?new?FileOutputStream("Test1.txt");//子類序列化

oout?=?new?ObjectOutputStream(out);

oout.writeObject(subc);

oout.close();

oout=null;

in?=?new?FileInputStream("Test1.txt");

oin?=?new?ObjectInputStream(in);

SubC?subc2=(SubC)oin.readObject();//子類反序列化

System.out.println(subc2);

}?catch?(Exception?ex){

ex.printStackTrace();

}?finally{

…此處省略

}

}

}

運行結果如下:

supervalue:?100?sub:?200

可見子類成功的序列化/反序列化了。

怎管讓子類實現序列化看起來是一件很簡單的事情,但有的時候,往往我們不能夠讓父類實現Serializable接口,原因是有時候父類是抽象的(這并沒有關系),并且父類不能夠強制每個子類都擁有序列化的能力。換句話說父類設計的目的僅僅是為了被繼承。

要為一個沒有實現Serializable接口的父類,編寫一個能夠序列化的子類是一件很麻煩的事情。java?docs中提到:

“To?allow?subtypes?of?non-serializable?classes?to?be?serialized,?the?subtype?may?assume?responsibility?for?saving?and?restoring?the?state?of?the?supertype's?public,?protected,?and?(if?accessible)?package?fields.?The?subtype?may?assume?this?responsibility?only?if?the?class?it?extends?has?an?accessible?no-arg?constructor?to?initialize?the?class's?state.?It?is?an?error?to?declare?a?class?Serializable?if?this?is?not?the?case.?The?error?will?be?detected?at?runtime.?”

也就是說,要為一個沒有實現Serializable接口的父類,編寫一個能夠序列化的子類要做兩件事情:

其一、父類要有一個無參的constructor;

其二、子類要負責序列化(反序列化)父類的域。

我們將SuperC的Serializable接口去掉,而給SubC加上Serializable接口。運行后產生錯誤:

java.lang.Error:?Unresolved?compilation?problem:

Serializable?cannot?be?resolved?or?is?not?a?valid?superinterface

at?Serial.SubC.(SubC.java:15)

at?Serial.Test1.main(Test1.java:19)

Exception?in?thread?"main"

果真如docs中所說的一樣,父類缺少無參構造函數是不行的。

接下來,按照docs中的建議我們改寫這個例子:

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();//再反序列化父類的域

}

}

運行結果證明了這種方法是正確的。在此處我們用到了writeObject/?readObject方法,這對方法如果存在的話,序列化時就會被調用,以代替默認的行為(以后還要探討,先了解這么多)。我們在序列化時,首先調用了ObjectOutputStream的defaultWriteObject,它使用默認的序列化行為,然后序列化父類的域;反序列化的時候也一樣。

歸納一下:

目的?行為

為一個實現Serializable接口的父類,編寫一個能夠序列化的子類?子類將自動的實現序列化

為一個沒有實現Serializable接口的父類,編寫一個能夠序列化的子類?1,?父類要有一個無參的constructor;2,?子類要先序列化自身,然后子類要負責序列化父類的域

跟多參考:http://www.ibm.com/developerworks/cn/java/j-lo-serial/

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java继承序列化_java中序列化之子类继承父类序列化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。