序列化和反序列化

序列化:將堆內(nèi)存中的Java對象,轉(zhuǎn)換成字節(jié)序列,使其支持持久化存儲(存儲到磁盤)和網(wǎng)絡(luò)傳輸

反序列化:將字節(jié)序列恢復(fù)成成Java 對象(需要Java 對象的 .class文件)

1. 實(shí)現(xiàn) Serializable 接口

要想實(shí)現(xiàn)序列化,必須實(shí)現(xiàn) Serializable接口

public class Student implements Serializable {

    private static final long serialVersionUID = 987884045085285050L;

    private static String school = "中科大";
    private int age;
    private String name;
    private transient Double height=12.32;
}

2. 使用 ObjectOutputStream ObjectInputStream 存儲讀取Java對象

public static void main(String[] args) {
    Student student = new Student();
    student.setAge(12);
    student.setHeight(182.00);
    student.setName("張三");
    ObjectOutputStream outputStream = new     
    ObjectOutputStream(new FileOutputStream("a.txt"));
    outputStream.writeObject(student);

    ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("a.txt"));
    Student student = (Student) inputStream.readObject();
    System.out.println(student);
}

3. 某些隱私字段不想序列化:transient

如果Java對象中的某些隱私字段(例中的 height)不希望序列化后在網(wǎng)絡(luò)中傳輸,可以添加 transient屬性,表明該字段不會被序列化。

4. Java 類中定義的 static 字段不會被序列化

public class Student implements Serializable {
    private static String school = "中科大";
    ...
}

序列化時,會忽略static 修飾的字段school,但是進(jìn)行反序列化時,仍然可以取出該對象的school 值為 “中科大”,該數(shù)據(jù)并不是從序列化二進(jìn)制數(shù)據(jù)中所得,而是從 JVM 中得到。

5. 序列化版本問題:serialVersionUID

如果Java 對象中沒有指定 serialVersionUID 的值,則該值會自動根據(jù)對象中的屬性計(jì)算賦值,即屬性改變后 serialVersionUID 也會改變
這樣就可能導(dǎo)致序列化版本不一致問題:在完成序列化操作后,生成初始 serialVersionUID,.class 和 序列化二進(jìn)制數(shù)據(jù)均可計(jì)算出該相同的serialVersionUID 。
由于項(xiàng)目的升級或修改,可能我們會對序列化對象進(jìn)行修改,比如增加某個字段,.class文件改變。那么我們在進(jìn)行反序列化時根據(jù).class 計(jì)算得到的時 new serialVersionUID,而根據(jù)序列化生成的二進(jìn)制數(shù)據(jù)得到的是 初始 serialVersionUID,不一致,就會報(bào)錯。

解決:為每個序列化的對象手動指定serialVersionUID

private static final long serialVersionUID = 987884045085285050L;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • JAVA序列化機(jī)制的深入研究 對象序列化的最主要的用處就是在傳遞,和保存對象(object)的時候,保證對象的完整...
    時待吾閱讀 10,920評論 0 24
  • 1.背景 某天,我在寫代碼定義 bean 的時候,順手寫了個 public class User implemen...
    李眼鏡閱讀 789評論 0 2
  • 什么是序列化? 序列化是將對象存儲為二進(jìn)制格式。在序列化的過程中,對象和它的元數(shù)據(jù)(比如對象的類名和它的屬性名稱)...
    Chokez閱讀 1,112評論 0 0
  • 序列化簡介 Java序列化,一個日常開發(fā)中比較少用到的技術(shù)。正常情況下,JVM啟動后,我們可以創(chuàng)建對象,JVM關(guān)閉...
    不知名的蛋撻閱讀 554評論 1 0
  • 涉及劇透,還沒看的去影院支持一波吧。 今天去刷了一波《你的名字》,看完之后,如果說要用一個字概括《你的名字》這部電...
    0度成霜閱讀 858評論 0 4