新聞中心
這篇文章給大家介紹java中如何實(shí)現(xiàn)對象的序列化和反序列化,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括瀘州網(wǎng)站建設(shè)、瀘州網(wǎng)站制作、瀘州網(wǎng)頁制作以及瀘州網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,瀘州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到瀘州省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
引言:
序列化是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程,在序列化期間,對象將其帶你過去的狀態(tài)寫入到臨時(shí)或持儲(chǔ)存區(qū),反序列化就是重新創(chuàng)建對象的過程,此對象來自于臨時(shí)或持久儲(chǔ)存區(qū)。
序列化的作用:
就好比如存儲(chǔ)數(shù)據(jù)到數(shù)據(jù)庫,將一些數(shù)據(jù)持久化到數(shù)據(jù)庫中,而有時(shí)候需要將對象持久化,雖然說將對象狀態(tài)持久化的方式有很多,但是java給我們提供了一種很便捷的方式,那就是序列化,序列化可以實(shí)現(xiàn)對象到文件之間的直接轉(zhuǎn)換,實(shí)現(xiàn)細(xì)節(jié)對我們隱藏。
具體的三種用途:
?將對象的狀態(tài)信息持久化保存到硬盤上
?將對象信息在網(wǎng)絡(luò)上傳輸
?深度克?。ň褪切蛄谢笤俜葱蛄谢?/p>
方式一:實(shí)現(xiàn)Serializable接口,通過序列化流
實(shí)現(xiàn)Serializable接口,通過ObjectOutputStream和ObjectInputStream將對象序列化和反序列化。
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寫入字節(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寫入文件中 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接口,重寫writeExternal和readExternal方法
Externalizable接口繼承了Serializable接口,替我們封裝了兩個(gè)方法,一個(gè)用于序列化,一個(gè)用于反序列化。這種方式是將屬性序列化,注意這種方式transient修飾詞將失去作用,也就是說被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ì)被序列化,但是使用方式二的話,明確寫明該屬性序列化同樣可以得到序列化。
?serialVersionUID屬性是類的序列化標(biāo)識(shí)ID,若序列化的對象和反序列化的對象其serialVersionUID屬性不一樣則會(huì)報(bào)錯(cuò)。
關(guān)于java中如何實(shí)現(xiàn)對象的序列化和反序列化就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站欄目:java中如何實(shí)現(xiàn)對象的序列化和反序列化
本文網(wǎng)址:http://www.dlmjj.cn/article/ppdoij.html