1. 程式人生 > 其它 >淺談java序列化

淺談java序列化

1、概念:

  序列化:把物件轉換為位元組序列的過程

  反序列化:把位元組序列轉化為物件的過程

2、程式碼:

public class Person implements Serializable{
  // 指定序列化版本號
public static final long serialVersionUID = 112233445566778899L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}


// 測public class SerializeTest { public static void main(String[] args) {
        serializeObj();
deserializeObj();
}
/**
* 序列化
*/
public static void serializeObj() {
Person person = new Person();
person.setName("李白");
person.setAge(10);
try {
       // 把物件序列化後的位元組存放到指定的檔案裡 
File file = new File("E:/person.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(person);
System.out.println("序列化完成");
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 反序列化
*/
public static void deserializeObj() {
try {
File file = new File("E:/person.txt");
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Person person = (Person) objectInputStream.readObject();
System.out.println("反序列化完成");
System.out.println(person);
objectInputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}


3、用處
 

  伺服器端session的儲存、通訊時傳輸的資料等。
  伺服器把session序列化後存到硬碟,以便節省記憶體,用到的時候在進行反序列化成Session物件。
  通訊時資料傳輸的是序列化的位元組,接收引數時會進行反序列化成特定物件。

4、serialVersionUID
  該欄位是序​列​化​的​版​本​號​,實現了Serializable介面的類都有這個變數。
  該欄位可顯示指定,也可不指定。當不指定時,編譯器會自動給這個class生成一個預設的版本號。
  
serialVersionUID 是序列化和反序列化之間的接頭暗號,只有這個暗號對得上反序列化才能成功!

  如果實現
Serializable 介面的時候沒有指定
serialVersionUID 也是沒什麼問題的,但會存在一種隱患:序列化後,將Person類進行了修改,哪怕是加個空格,反序列化也會失敗!
  因為編譯器認為你的Person類結構變了,會重新生成一個serialVersionUID,反序列化的時候暗號對不上,無法反序列化。
  所以,建議實現Serializable介面的時候指定serialVersionUID,避免反序列化時的相容性衝突。