實(shí)例分析java對(duì)象的序列化和反序列化
引言:
序列化是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程,在序列化期間,對(duì)象將其帶你過(guò)去的狀態(tài)寫(xiě)入到臨時(shí)或持儲(chǔ)存區(qū),反序列化就是重新創(chuàng)建對(duì)象的過(guò)程,此對(duì)象來(lái)自于臨時(shí)或持久儲(chǔ)存區(qū)。
序列化的作用:
就好比如存儲(chǔ)數(shù)據(jù)到數(shù)據(jù)庫(kù),將一些數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)中,而有時(shí)候需要將對(duì)象持久化,雖然說(shuō)將對(duì)象狀態(tài)持久化的方式有很多,但是java給我們提供了一種很便捷的方式,那就是序列化,序列化可以實(shí)現(xiàn)對(duì)象到文件之間的直接轉(zhuǎn)換,實(shí)現(xiàn)細(xì)節(jié)對(duì)我們隱藏。
具體的三種用途:
•將對(duì)象的狀態(tài)信息持久化保存到硬盤上
•將對(duì)象信息在網(wǎng)絡(luò)上傳輸
•深度克?。ň褪切蛄谢笤俜葱蛄谢?/p>
方式一:實(shí)現(xiàn)Serializable接口,通過(guò)序列化流
實(shí)現(xiàn)Serializable接口,通過(guò)ObjectOutputStream和ObjectInputStream將對(duì)象序列化和反序列化。
import java.io.*; public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } public static void main(String[] args) throws IOException, ClassNotFoundException { // User user = new User("gol",22); // ByteArrayOutputStream bo = new ByteArrayOutputStream(); // ObjectOutputStream oo = new ObjectOutputStream(bo); // oo.writeObject(user);//序列化.user寫(xiě)入字節(jié)數(shù)組流中 // ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); // ObjectInputStream oi = new ObjectInputStream(bi); // User userSer = (User) oi.readObject();//反序列化 // System.out.println(userSer); User user = new User("gol",22); FileOutputStream fos = new FileOutputStream("a.txt"); ObjectOutputStream oo = new ObjectOutputStream(fos); oo.writeObject(user);//序列化.user寫(xiě)入文件中 FileInputStream fis = new FileInputStream("a.txt"); ObjectInputStream oi = new ObjectInputStream(fis); User userSer = (User) oi.readObject();//反序列化 System.out.println(userSer); oi.close(); fis.close(); oo.close(); fos.close(); } }
方式二:實(shí)現(xiàn)Externalizable接口,重寫(xiě)writeExternal和readExternal方法
Externalizable接口繼承了Serializable接口,替我們封裝了兩個(gè)方法,一個(gè)用于序列化,一個(gè)用于反序列化。這種方式是將屬性序列化,注意這種方式transient修飾詞將失去作用,也就是說(shuō)被transient修飾的屬性,只要你在writeExternal方法中序列化了該屬性,照樣也會(huì)得到序列化。
import java.io.*; public class User implements Externalizable { private static final long serialVersionUID = 1L; private String name; private int age; public User() { } public User(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(this.name);//將屬性分別序列化 out.writeObject(this.age); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { this.name=(String)in.readObject();//反序列化屬性 this.age=(int)in.readObject(); } public static void main(String[] args) throws IOException, ClassNotFoundException { FileOutputStream fos = new FileOutputStream("a.txt"); ObjectOutputStream oo = new ObjectOutputStream(fos); FileInputStream fis = new FileInputStream("a.txt"); ObjectInputStream oi = new ObjectInputStream(fis); User user = new User("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é):
注意以下三點(diǎn):
•Serializable接口是標(biāo)記接口,是個(gè)空接口,用于標(biāo)識(shí)該類可以被序列化。
•transient是屬性修飾符,被其修飾的屬性將不會(huì)被序列化,但是使用方式二的話,明確寫(xiě)明該屬性序列化同樣可以得到序列化。
•serialVersionUID屬性是類的序列化標(biāo)識(shí)ID,若序列化的對(duì)象和反序列化的對(duì)象其serialVersionUID屬性不一樣則會(huì)報(bào)錯(cuò)。
相關(guān)文章
SpringBoot集成geodesy實(shí)現(xiàn)距離計(jì)算功能
Geodesy:大地測(cè)量學(xué)的神奇力量 Geodesy,又稱大地測(cè)量學(xué),是一門研究地球形狀、大小及其重力場(chǎng)的學(xué)科,在地球距離計(jì)算中,它扮演著至關(guān)重要的角色,故本文給大家介紹了SpringBoot集成geodesy實(shí)現(xiàn)距離計(jì)算功能,感興趣的朋友可以參考下2024-06-06Mybatis批量插入大量數(shù)據(jù)的最優(yōu)方式總結(jié)
批量插入功能是我們?nèi)粘9ぷ髦斜容^常見(jiàn)的業(yè)務(wù)功能之一,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Mybatis批量插入大量數(shù)據(jù)的幾種最優(yōu)方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03Java FileInputStream讀中文亂碼問(wèn)題解決方案
這篇文章主要介紹了Java FileInputStream讀中文亂碼問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Java中java.lang.ClassCastException異常原因以及解決方法詳解
這篇文章主要給大家介紹了關(guān)于Java中java.lang.ClassCastException異常原因以及解決方法的相關(guān)資料,ClassCastException從字面上看是類型轉(zhuǎn)換錯(cuò)誤,通常是進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)候出的錯(cuò)誤,需要的朋友可以參考下2024-02-02解決Swagger修改請(qǐng)求對(duì)象字段文檔不更新問(wèn)題
這篇文章主要為大家介紹了解決Swagger修改請(qǐng)求對(duì)象字段文檔不更新的問(wèn)題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05關(guān)于SpringBoot3.x中spring.factories功能被移除的解決方案
這篇文章主要介紹了SpringBoot3.x中spring.factories功能被移除的解決方案,在配置好相關(guān)依賴、最小啟動(dòng)類和配置之后,發(fā)現(xiàn)項(xiàng)目無(wú)法啟動(dòng),于是根據(jù)啟動(dòng)上下文日志和按行DEBUG找到原因并且在等待組件升級(jí)兼容之前進(jìn)行臨時(shí)性解決,需要的朋友可以參考下2022-12-12Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(39)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07