java對象的序列化和反序列化

引言:

  序列化是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程鬓照,在序列化期間,對象將其帶你過去的狀態(tài)寫入到臨時或持儲存區(qū)减江,反序列化就是重新創(chuàng)建對象的過程提岔,此對象來自于臨時或持久儲存區(qū)拆座。

序列化的作用:

  就好比如存儲數(shù)據(jù)到數(shù)據(jù)庫主巍,將一些數(shù)據(jù)持久化到數(shù)據(jù)庫中,而有時候需要將對象持久化挪凑,雖然說將對象狀態(tài)持久化的方式有很多孕索,但是java給我們提供了一種很便捷的方式,那就是序列化躏碳,序列化可以實現(xiàn)對象到文件之間的直接轉(zhuǎn)換搞旭,實現(xiàn)細(xì)節(jié)對我們隱藏。

  具體的三種用途:

將對象的狀態(tài)信息持久化保存到硬盤上

將對象信息在網(wǎng)絡(luò)上傳輸

深度克鹿矫唷(就是序列化后再反序列化)

方式一:實現(xiàn)Serializable接口肄渗,通過序列化流

  實現(xiàn)Serializable接口,通過ObjectOutputStream和ObjectInputStream將對象序列化和反序列化咬最。

importjava.io.*;publicclassUserimplements Serializable {

? ? privatestaticfinallongserialVersionUID = 1L;

? ? private String name;

? ? privateint age;

? ? publicUser(String name,int age) {

? ? ? ? this.name = name;

? ? ? ? this.age = age;

? ? }

? ? @Override

? ? public String toString() {

? ? ? ? return"User{" +? ? ? ? ? ? ? ? "name='" + name + '\'' +? ? ? ? ? ? ? ? ", age=" + age +? ? ? ? ? ? ? ? '}';

? ? }

? ? publicstaticvoidmain(String[] args)throws IOException, ClassNotFoundException {//? ? ? ? User user = new User("gol",22);//? ? ? ? ByteArrayOutputStream bo = new ByteArrayOutputStream();//? ? ? ? ObjectOutputStream oo = new ObjectOutputStream(bo);//? ? ? ? oo.writeObject(user);//序列化.user寫入字節(jié)數(shù)組流中//? ? ? ? ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());//? ? ? ? ObjectInputStream oi = new ObjectInputStream(bi);//? ? ? ? User userSer = (User) oi.readObject();//反序列化//? ? ? ? System.out.println(userSer);User user =newUser("gol",22);

? ? ? ? FileOutputStream fos =newFileOutputStream("a.txt");

? ? ? ? ObjectOutputStream oo =new ObjectOutputStream(fos);

? ? ? ? oo.writeObject(user);//序列化.user寫入文件中FileInputStream fis =newFileInputStream("a.txt");

? ? ? ? ObjectInputStream oi =new ObjectInputStream(fis);

? ? ? ? User userSer = (User) oi.readObject();//反序列化? ? ? ? System.out.println(userSer);

? ? ? ? oi.close();

? ? ? ? fis.close();

? ? ? ? oo.close();

? ? ? ? fos.close();

? ? }

}


方式二:實現(xiàn)Externalizable接口翎嫡,重寫writeExternal和readExternal方法

  Externalizable接口繼承了Serializable接口,替我們封裝了兩個方法永乌,一個用于序列化惑申,一個用于反序列化。這種方式是將屬性序列化翅雏,注意這種方式transient修飾詞將失去作用圈驼,也就是說被transient修飾的屬性,只要你在writeExternal方法中序列化了該屬性望几,照樣也會得到序列化绩脆。

importjava.io.*;publicclassUserimplements Externalizable {

? ? privatestaticfinallongserialVersionUID = 1L;

? ? private? String name;

? ? privateint age;

? ? public User() {

? ? }

? ? publicUser(String name,int age) {

? ? ? ? this.name = name;

? ? ? ? this.age = age;

? ? }

? ? @Override

? ? public String toString() {

? ? ? ? return"User{" +? ? ? ? ? ? ? ? "name='" + name + '\'' +? ? ? ? ? ? ? ? ", age=" + age +? ? ? ? ? ? ? ? '}';

? ? }

? ? @Override

? ? publicvoidwriteExternal(ObjectOutput out)throws IOException {

? ? ? ? out.writeObject(this.name);//將屬性分別序列化out.writeObject(this.age);

? ? }

? ? @Override

? ? publicvoidreadExternal(ObjectInput in)throws IOException, ClassNotFoundException {

? ? ? ? this.name=(String)in.readObject();//反序列化屬性this.age=(int)in.readObject();

? ? }

? ? publicstaticvoidmain(String[] args)throws IOException, ClassNotFoundException {

? ? ? ? FileOutputStream fos =newFileOutputStream("a.txt");

? ? ? ? ObjectOutputStream oo =new ObjectOutputStream(fos);

? ? ? ? FileInputStream fis =newFileInputStream("a.txt");

? ? ? ? ObjectInputStream oi =new ObjectInputStream(fis);

? ? ? ? User user =newUser("gol",19);

? ? ? ? user.writeExternal(oo);//序列化User userEnr =new User();

? ? ? ? userEnr.readExternal(oi);//反序列化? ? ? ? System.out.println(userEnr);

? ? ? ? oi.close();

? ? ? ? fis.close();

? ? ? ? oo.close();

? ? ? ? fos.close();

? ? }

}


總結(jié):

  注意以下三點:

Serializable接口是標(biāo)記接口,是個空接口橄抹,用于標(biāo)識該類可以被序列化靴迫。

transient是屬性修飾符,被其修飾的屬性將不會被序列化楼誓,但是使用方式二的話矢劲,明確寫明該屬性序列化同樣可以得到序列化。

serialVersionUID屬性是類的序列化標(biāo)識ID慌随,若序列化的對象和反序列化的對象其serialVersionUID屬性不一樣則會報錯。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 歡迎工作一到五年的Java工程師朋友們加入Java群:?891219277?

群內(nèi)提供免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)阁猜、高性能及分布式丸逸、Jvm性能調(diào)優(yōu)、Spring源碼剃袍,MyBatis黄刚,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰民效!趁年輕憔维,使勁拼,給未來的自己一個交代畏邢!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末业扒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舒萎,更是在濱河造成了極大的恐慌程储,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臂寝,死亡現(xiàn)場離奇詭異章鲤,居然都是意外死亡,警方通過查閱死者的電腦和手機咆贬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門败徊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掏缎,你說我怎么就攤上這事皱蹦。” “怎么了御毅?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵根欧,是天一觀的道長。 經(jīng)常有香客問我端蛆,道長凤粗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任今豆,我火速辦了婚禮嫌拣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呆躲。我一直安慰自己异逐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布插掂。 她就那樣靜靜地躺著灰瞻,像睡著了一般腥例。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酝润,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天燎竖,我揣著相機與錄音,去河邊找鬼要销。 笑死构回,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疏咐。 我是一名探鬼主播纤掸,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浑塞!你這毒婦竟也來了借跪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤缩举,失蹤者是張志新(化名)和其女友劉穎垦梆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仅孩,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡托猩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辽慕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片京腥。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溅蛉,靈堂內(nèi)的尸體忽然破棺而出公浪,到底是詐尸還是另有隱情,我是刑警寧澤船侧,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布欠气,位于F島的核電站,受9級特大地震影響镜撩,放射性物質(zhì)發(fā)生泄漏预柒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一袁梗、第九天 我趴在偏房一處隱蔽的房頂上張望宜鸯。 院中可真熱鬧,春花似錦遮怜、人聲如沸淋袖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽即碗。三九已至焰情,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剥懒,已是汗流浹背烙样。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蕊肥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓蛤肌,卻偏偏與公主長得像壁却,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裸准,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容