# Serialization
序列化, 用於把一個instance轉為byte stream,
並且可以把byte stream用 網路/檔案 傳送,再進行反序列化, 還原instance.
假設我們有一個class叫做Person,
想要要對他的instance進行序列化, 直接實作Serializable接口
```java=
public class Person implements Serializable {
private final int id;
private final String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person{id=" + id + ", name=" + name + "}";
}
}
```
## Serialize
使用ObjectOutputStream把物件write到某個地方, 例如檔案(File)
```java=
public static void main(String[] args) {
Person p = new Person(19,"andy");
FileOutputStream fileOut = new FileOutputStream("test.txt");
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(p);
objectOut.close();
fileOut.close();
}
```
## Unserialize
```java=
public static void main(String[] args) {
FileInputStream fileIn = new FileInputStream("test.txt");
ObjectInputStream objectIn = new ObjectInputStream(fileIn);
Person p = (Person) objectIn.readObject();
objectIn.close();
fileIn.close();
System.out.println(p); // Person{id=19, name=andy}
}
```
### SerialVersionId
可以在Serializable裡放一個serialVersionUID (long)
序列化時,id會被寫入stream中
反序列化時,id會跟反序列class的id比對
如果不同, 丟出InvalidClassException
總之, **序列化class的id 與 反序列化class的id 必須相同**
預設是會自動按照class member生成SerialVersionId, 但也可以自己寫。
```java=
public class Person implements Serializable {
@Serial
private static final long serialVersionUID = 1000000L;
//...
}
```