serialization 序列化

在C++程式語言中,語言本身所提供的資料表示可以用內建基礎型別(primitive type)如整型(integral type e.g. bool, char, int等)、浮點數(float, double),或是複合型別(array, class, pointer),但是當需要將程式語言理所表示的資料進行傳輸時,例如傳到磁碟上或是傳到另一個端點時,就會碰到要傳那些資料以及格式的問題,對於基礎型別來說,可以直接將整塊記憶體內容直接儲存傳送(但跨機器時可能會有其他問題,如byte ordering),對於牽涉到指標型別來說,就沒辦法指複製指標本身的值,而要考慮到所指的內容。物件的內容若牽涉到其他狀態(例如file handle)也沒辦法直接複製記憶體內容,因為這類資訊牽涉到當時的執行環境狀態。如果在重建端無法存取到所描述值的外部系統的狀態,這樣的重建是沒有意義的。

序列化有個最重要的原則: 序列化的資料足以重建回物件的狀態,跨越空間與時間。序列化的內容也可與外部系統相關,但前提是重建時要能夠存取的到,例如儲存DB table的row id,重建端要有辦法存取相關系統,才能還原。

這邊講物件重建回來原來狀態並非指結構上(structural)的值嚴格地完全相同,而是行為上(behavioral)要能夠一致。
舉例來說,假如我有一個檔案讀寫的物件,那麼需要重建回物件的狀態使得接下來的操作行為可以與原來相同,這樣序列化至少就需要檔案路徑、開檔模式、讀寫的position offset等,而依照這樣資訊重建回來的物件,物件內部檔案handle的值一般來說不會相同,但對物件的操作結果應該會一致。

對於單純儲存值的物件,可以想成這些值本身就是狀態,我們去get/set value時,在序列化前和還原後行為應該一致。

常見的序列化格式 XML, JSON, Avro, Apache Thrift, Google ProtoBuf 等
在設計上從schema的自我描述、傳輸的效率、版本控制等各有特色。

This entry was posted in MOM. Bookmark the permalink.

Leave a Reply