您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java序列化是什么”,在日常操作中,相信很多人在Java序列化是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java序列化是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
對(duì)于一個(gè)存在Java虛擬機(jī)中的對(duì)象來說,其內(nèi)部的狀態(tài)只是保存在內(nèi)存中。JVM退出之后,內(nèi)存資源也就被釋放,Java對(duì)象的內(nèi)部狀態(tài)也就丟失了。而在很多情況下,對(duì)象內(nèi)部狀態(tài)是需要被持久化的,將運(yùn)行中的對(duì)象狀態(tài)保存下來(最直接的方式就是保存到文件系統(tǒng)中),在需要的時(shí)候可以還原,即使是在Java虛擬機(jī)退出的情況下。
對(duì)象序列化機(jī)制是Java內(nèi)建的一種對(duì)象持久化方式,可以很容易實(shí)現(xiàn)在JVM中的活動(dòng)對(duì)象與字節(jié)數(shù)組(流)之間進(jìn)行轉(zhuǎn)換,使用得Java對(duì)象可以被存儲(chǔ),可以被網(wǎng)絡(luò)傳輸,在網(wǎng)絡(luò)的一端將對(duì)象序列化成字節(jié)流,經(jīng)過網(wǎng)絡(luò)傳輸?shù)骄W(wǎng)絡(luò)的另一端,可以從字節(jié)流重新還原為Java虛擬機(jī)中的運(yùn)行狀態(tài)中的對(duì)象。
Java類中對(duì)象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。
Java代碼
ObjectOutputStream(OutputStream out); void writeObject(Object obj);//將指定的對(duì)象的非transient,非static屬性,寫入ObjectOutputStream ObjectInputStream(InputStream in); Object readObject();//從指定的流中讀取還原對(duì)象信息
只能使用readObject()|writeObject()方法對(duì)對(duì)象進(jìn)行讀寫操作。除對(duì)象之外,Java中的基本類型和數(shù)組也可以被序列化,對(duì)于基本類型,可以使用readInt(),writeInt(), readDouble(),writeDouble()等類似的接口進(jìn)行讀寫。
對(duì)于任何需要被序列化的對(duì)象,都必須要實(shí)現(xiàn)接口Serializable,它只是一個(gè)標(biāo)識(shí)接口,本身沒有任何成員,只是用來標(biāo)識(shí)說明當(dāng)前的實(shí)現(xiàn)類的對(duì)象可以被序列化.
如果在類中的一些屬性,希望在對(duì)象序列化過程中不被序列化,使用關(guān)鍵字transient標(biāo)注修飾就可以.當(dāng)對(duì)象被序列化時(shí),標(biāo)注為transient的成員屬性將會(huì)自動(dòng)跳過。
(1).當(dāng)一個(gè)對(duì)象被序列化時(shí),只保存對(duì)象的非靜態(tài)成員變量,不能保存任何的成員方法,靜態(tài)的成員變量和transient標(biāo)注的成員變量。 (2).如果一個(gè)對(duì)象的成員變量是一個(gè)對(duì)象,那么這個(gè)對(duì)象的數(shù)據(jù)成員也會(huì)被保存還原,而且會(huì)是遞歸的方式。 (3).如果一個(gè)可序列化的對(duì)象包含對(duì)某個(gè)不可序列化的對(duì)象的引用,那么整個(gè)序列化操作將會(huì)失敗,并且會(huì)拋出一個(gè)NotSerializableException??梢詫⑦@個(gè)引用標(biāo)記transient,那么對(duì)象仍然可以序列化。
class Student implements Serializable{ private String name; private transient int age; private Course course; public void setCourse(Course course){ this.course = course; } public Course getCourse(){ return course; } public Student(String name, int age){ this.name = name; this.age = age; } public String toString(){ return "Student Object name:"+this.name+" age:"+this.age; } } class Course implements Serializable{ private static String courseName; private int credit; public Course(String courseName, int credit){ this.courseName = courseName; this.credit = credit; } public String toString(){ return "Course Object courseName:"+courseName +" credit:"+credit; } }
將對(duì)象寫入文件,序列化
public class TestWriteObject{ public static void main(String[] args) { String filePath = "C://obj.txt"; ObjectOutputStream objOutput = null; Course c1 = new Course("C language", 3); Course c2 = new Course("OS", 4); Student s1 = new Student("king", 25); s1.setCourse(c1); Student s2 = new Student("jason", 23); s2.setCourse(c2); try { objOutput = new ObjectOutputStream(new FileOutputStream(filePath)); objOutput.writeObject(s1); objOutput.writeObject(s2); objOutput.writeInt(123); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { objOutput.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("Info:對(duì)象被寫入"+filePath); }
從文件中讀取對(duì)象,反序列化
public class TestReadObject { public static void main(String[] args) { String filePath = "C://obj.txt"; ObjectInputStream objInput = null; Student s1 = null,s2 = null; int intVal = 0; try { objInput = new ObjectInputStream(new FileInputStream(filePath)); s1 = (Student)objInput.readObject(); s2 = (Student)objInput.readObject(); intVal = objInput.readInt(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch(ClassNotFoundException cnfe){ cnfe.printStackTrace(); }finally{ try { objInput.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("Info:文件"+filePath+"中讀取對(duì)象"); System.out.println(s1); System.out.println(s1.getCourse()); System.out.println(s2); System.out.println(s2.getCourse()); System.out.println(intVal); } }
輸出:
[TestWriteObject] Info:對(duì)象被寫入C://obj.txt
[TestReadObjec] Info:文件C://obj.txt中讀取對(duì)象 Info:文件C://obj.txt中讀取對(duì)象 Student Object name:king age:0 Course Object courseName:null credit:3 Student Object name:jason age:0 Course Object courseName:null credit:4 123
可知Person中的age屬性被標(biāo)注為transient后,在序列化對(duì)象時(shí),age屬性就沒有被序列化了; Course中的name屬性被static后,Course的name靜態(tài)屬性就沒有被序列化;雖然是序列化Person對(duì)象,但是Person所引用的Course對(duì)象也被初始化了。
到此,關(guān)于“Java序列化是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。