溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java序列化是什么

發(fā)布時(shí)間:2021-06-23 11:05:30 來源:億速云 閱讀:107 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“Java序列化是什么”,在日常操作中,相信很多人在Java序列化是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java序列化是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

Java序列化

對(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ì)象。

1.相關(guān)的接口

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)行讀寫。

2.Serializable接口

對(duì)于任何需要被序列化的對(duì)象,都必須要實(shí)現(xiàn)接口Serializable,它只是一個(gè)標(biāo)識(shí)接口,本身沒有任何成員,只是用來標(biāo)識(shí)說明當(dāng)前的實(shí)現(xiàn)類的對(duì)象可以被序列化.

3.transient關(guān)鍵字

如果在類中的一些屬性,希望在對(duì)象序列化過程中不被序列化,使用關(guān)鍵字transient標(biāo)注修飾就可以.當(dāng)對(duì)象被序列化時(shí),標(biāo)注為transient的成員屬性將會(huì)自動(dòng)跳過。

4.Java序列化中需要注意

(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ì)象仍然可以序列化。

5.一個(gè)綜合實(shí)例

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í)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI