本節(jié)我們詳細講解10.3節(jié)中提到的序列化和反序列化操作。
序列化和反序列化是什么
當兩個進程遠程通信時疑苫,彼此可以發(fā)送各種類型的數(shù)據(jù)抡笼。?無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡(luò)上傳送仔戈。比如,我們可以通過http協(xié)議發(fā)送字符串信息;我們也可以在網(wǎng)絡(luò)上直接發(fā)送JAVA對象监徘。發(fā)送方需要把這個Java對象轉(zhuǎn)換為字節(jié)序列晋修,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復為Java對象凰盔。
把Java對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化墓卦。把字節(jié)序列恢復為Java對象的過程稱為對象的反序列化。
對象序列化的作用有如下兩種:
持久化:?把對象的字節(jié)序列永久地保存到硬盤上廊蜒,通常存放在一個文件中趴拧;比如:休眠的實現(xiàn)。以后服務(wù)器session管理山叮,hibernate將對象持久化實現(xiàn)。
網(wǎng)絡(luò)通信:在網(wǎng)絡(luò)上傳送對象的字節(jié)序列添履。比如:服務(wù)器之間的數(shù)據(jù)通信屁倔,對象傳遞。
序列化涉及的類和接口
ObjectOutputStream代表對象輸出流暮胧,它的writeObject(Object obj)方法可對參數(shù)指定的obj對象進行序列化锐借,把得到的字節(jié)序列寫到一個目標輸出流中。
ObjectInputStream代表對象輸入流往衷,它的readObject()方法從一個源輸入流中讀取字節(jié)序列钞翔,再把它們反序列化為一個對象,并將其返回席舍。
只有實現(xiàn)了Serializable接口的類的對象才能被序列化布轿。?Serializable接口是空接口,只起到標記作用来颤。
序列化/反序列化的步驟和實例
【示例1】將類Person的實例進行序列化和反序列化
import?java.io.*;
class?Person?implements?Serializable {?// Person類實現(xiàn)Serializable接口
????int?age;
????boolean?isMan;
??? String?name;
????public?Person(int?age,?boolean?isMan, String?name) {
????????super();
????????this.age?=?age;
????????this.isMan?=?isMan;
????????this.name?=?name;
??? }
}
public?class?TestSerializable {
????public?static?void?main(String[]?args)?throws?IOException,
???????????? ClassNotFoundException {?? //限于篇幅汰扭,沒有按照try-catch-finally的//方式規(guī)范的進行流的關(guān)閉操作。實際工作中福铅,一定按照前面所述的標準方式關(guān)閉流萝毛。
????????//通過ObjectOutputStream將Person對象的數(shù)據(jù)寫入到文件中,即序列化滑黔。
??????? Person?person?=?new?Person(18,?true,?"高淇");
??????? FileOutputStream?fos?=?null;
??????? ObjectOutputStream?oos?=?null;
????????//?序列化
????????fos?=?new?FileOutputStream("d:/c.txt");
????????oos?=?new?ObjectOutputStream(fos);
????????oos.writeObject(person);
????????oos.flush();
????????oos.close();
????????fos.close();
????????//通過ObjectInputStream將文件中二進制數(shù)據(jù)反序列化成Person對象:
??????? ObjectInputStream?ois?=?null;
??????? FileInputStream?fis?=?null;
????????//?反序列化
????????fis?=?new?FileInputStream("d:/c.txt");
????????ois?=?new?ObjectInputStream(fis);
??????? Person?p?= (Person)?ois.readObject();
??????? System.out.println(p.name);
????????fis.close();
????????ois.close();
??? }
}
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記笆包。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗略荡,曾在神州數(shù)碼庵佣、航天院某所研發(fā)中心從事軟件設(shè)計及研發(fā)工作,從小白逐漸做到工程師撞芍、高級工程師秧了、架構(gòu)師。精通Java平臺軟件開發(fā)序无,精通JAVAEE验毡,熟悉各種流行開發(fā)框架衡创。
?筆記包含從淺入深的六大部分:
?A-Java入門階段
?B-數(shù)據(jù)庫從入門到精通
?C-手刃移動前端和Web前端
?D-J2EE從了解到實戰(zhàn)
?E-Java高級框架精解
?F-Linux和Hadoop?