91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java序列化是什么

發布時間:2021-06-23 11:05:30 來源:億速云 閱讀:107 作者:chen 欄目:大數據

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

Java序列化

對于一個存在Java虛擬機中的對象來說,其內部的狀態只是保存在內存中。JVM退出之后,內存資源也就被釋放,Java對象的內部狀態也就丟失了。而在很多情況下,對象內部狀態是需要被持久化的,將運行中的對象狀態保存下來(最直接的方式就是保存到文件系統中),在需要的時候可以還原,即使是在Java虛擬機退出的情況下。

對象序列化機制是Java內建的一種對象持久化方式,可以很容易實現在JVM中的活動對象與字節數組(流)之間進行轉換,使用得Java對象可以被存儲,可以被網絡傳輸,在網絡的一端將對象序列化成字節流,經過網絡傳輸到網絡的另一端,可以從字節流重新還原為Java虛擬機中的運行狀態中的對象。

1.相關的接口

Java類中對象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。

Java代碼

ObjectOutputStream(OutputStream out);  
    void writeObject(Object obj);//將指定的對象的非transient,非static屬性,寫入ObjectOutputStream  
     
    ObjectInputStream(InputStream in);  
    Object readObject();//從指定的流中讀取還原對象信息

只能使用readObject()|writeObject()方法對對象進行讀寫操作。除對象之外,Java中的基本類型和數組也可以被序列化,對于基本類型,可以使用readInt(),writeInt(), readDouble(),writeDouble()等類似的接口進行讀寫。

2.Serializable接口

對于任何需要被序列化的對象,都必須要實現接口Serializable,它只是一個標識接口,本身沒有任何成員,只是用來標識說明當前的實現類的對象可以被序列化.

3.transient關鍵字

如果在類中的一些屬性,希望在對象序列化過程中不被序列化,使用關鍵字transient標注修飾就可以.當對象被序列化時,標注為transient的成員屬性將會自動跳過。

4.Java序列化中需要注意

(1).當一個對象被序列化時,只保存對象的非靜態成員變量,不能保存任何的成員方法,靜態的成員變量和transient標注的成員變量。 (2).如果一個對象的成員變量是一個對象,那么這個對象的數據成員也會被保存還原,而且會是遞歸的方式。 (3).如果一個可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操作將會失敗,并且會拋出一個NotSerializableException。可以將這個引用標記transient,那么對象仍然可以序列化。

5.一個綜合實例

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;  
    }  
}

將對象寫入文件,序列化

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:對象被寫入"+filePath);  
    }

從文件中讀取對象,反序列化

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+"中讀取對象");  
        System.out.println(s1);  
        System.out.println(s1.getCourse());  
        System.out.println(s2);  
        System.out.println(s2.getCourse());  
        System.out.println(intVal);  
    }  
}

輸出:

[TestWriteObject] Info:對象被寫入C://obj.txt

[TestReadObjec] Info:文件C://obj.txt中讀取對象 Info:文件C://obj.txt中讀取對象 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屬性被標注為transient后,在序列化對象時,age屬性就沒有被序列化了; Course中的name屬性被static后,Course的name靜態屬性就沒有被序列化;雖然是序列化Person對象,但是Person所引用的Course對象也被初始化了。

到此,關于“Java序列化是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苏尼特右旗| 吉水县| 玉田县| 台山市| 涪陵区| 舒城县| 湟中县| 额敏县| 遵义市| 乌审旗| 达孜县| 富裕县| 普安县| 邯郸县| 双城市| 沙坪坝区| 鲁甸县| 怀安县| 通化市| 天台县| 兰考县| 明溪县| 南靖县| 昔阳县| 原平市| 禄丰县| 德昌县| 含山县| 图片| 巫山县| 卢湾区| 吐鲁番市| 虞城县| 镇赉县| 斗六市| 湖北省| 静海县| 无锡市| 余干县| 南雄市| 大邑县|