例如要把某個 Object 傳送到網路上的另一台電腦,或者要把 Object 暫存到檔案系統上
透過 Serialization 可以把 Object 轉換成可以寫入或傳送的 Stream 型態,就可以進行傳送或儲存
而接收方或者讀取方只要透過 deserialize 的程序,就可以把 Stream 還原成原本的 Object 型態。
如果是 Java 的話,可以透過 ObjectOutputStream.writeObject(Object obj) 把 Object 寫成 Stream
接收方或讀取方則是透過 ObjectInputStream.readObject() 加上 casting 來把 Object 還原。
範例程式碼可以參考 [4]。
如果在 Java 上想要調校 Serialization 的效率,也許可以參考 JDBM3 [5] 的 Serialization 的原始碼。
以下轉錄 JDBM3 專案描述中有關 Serialization 的敘述:
Space efficient serialization
- Custom code for most java.util and java.lang classes. For example Long(0) takes only single byte
- Very small POJO serialization overhead, typically only 3 bytes per class + 1 byte for each field.
- Mimic java serialization, fields can be transient, all classes needs to implement Serializable interface
- Supports Externalizable
- Possible to plug your own Serializer
2012-10-11 補充:
在 Java 中的自定義物件要能夠被序列化,必須要加上 implements Serialiable
例如在 JDBM3 中,有使用自定義物件時,如果沒有實作 Serialiable,會出現 IOError
追溯 Error 的原因,會出現在 JDBM3 中使用了以下的程式碼做檢查:
private void assertClassSerializable(Class clazz) throws NotSerializableException, InvalidClassException { if(containsClass(clazz)) return; if (!Serializable.class.isAssignableFrom(clazz)) throw new NotSerializableException(clazz.getName()); }containsClass() 函式是檢查這個 Class 之前是否曾檢查過,有的話就結束檢查
沒有的話會走到下一個 if,也就是用 Java 內建的方式檢查指定的 Class 是否可以被序列化。
如果這時 Class 沒有 implements Serialiable,在這裡檢查會回傳 false。
參考資料:
1、程式開發教學–進階觀念….序列化(Serialization)
2、Java中为什么要序列化?什么时候用到序列化?
3、Why we need to serialize the object
4、Java - Serialization
5、JDBM3
沒有留言:
張貼留言