IO 序列化詳講

2021-08-15 19:28:39 字數 2228 閱讀 9273

序列化  :將資料結構或物件轉換成二進位制串的過程

反序列化:將在序列化過程中所生成的二進位制串轉換成資料結構或者物件的過程

二進位制串:

序列化所生成的二進位制串指的是儲存在記憶體中的一塊資料。

簡單來說序列化就是一種用來處理物件流的機制。將物件輸出至檔案才會有序列化的產生。所謂物件流也就是將物件的內容進行流化,流的概念這裡不用多說(就是i/o)。我們可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間(注:要想將物件傳輸於網路必須進行流化)。

objectoutputstream類的乙個物件用於序列化乙個物件。

objectinputstream類的乙個物件用於反序列化乙個物件。

objectoutputstream繼承自outputstream。 objectinputstream繼承自inputstream。

類必須實現serializable或externalizable介面以便序列化或反序列化。

serializable介面是乙個標記介面。

l 當父類繼承serializable介面時,所有子類都可以被序列化

l 當子類實現seriaizable介面,父類沒有,繼承的父類屬性不能被序列化,資料丟失,但是不會報錯。子類屬性可以被序列化

l 如果序列化的屬性是物件,則這個物件必須實現serializable介面,否則會報錯。

l 在反序列化時,如果物件的屬性有修改刪除,則改動的部分會丟失,但不會報錯。

l 在反序列化時,serialversionuid被修改,則反序列化會失敗

每種序列化協議都有優點和缺點,它們在設計之初有自己獨特的應用場景。在系統設計的過程中,需要考慮序列化需求的方方面面,綜合對比各種序列化協議的特性,最終給出乙個折衷的方案。

通用性有兩個層面的意義:

第一、技術層面,序列化協議是否支援跨平台、跨語言。如果不支援,在技術層面上的通用性就大大降低了。

第二、流行程度,序列化和反序列化需要多方參與,很少人使用的協議往往意味著昂貴的學習成本;

另一方面,流行度低的協議,往往缺乏穩定而成熟的跨語言、跨平台的公共包。

以下兩個方面的原因會導致協議不夠強健:

第一、成熟度不夠,乙個協議從制定到實施,到最後成熟往往是乙個漫長的階段。協議的強健性依賴於大量而全面的測試,對於致力於提供高質量服務的系統,採用處於測試階段的序列化協議會帶來很高的風險。

第二、語言/平台的不公平性。為了支援跨語言、跨平台的功能,序列化協議的制定者需要做大量的工作;但是,當所支援的語言或者平台之間存在難以調和的特性的時候,協議制定者需要做乙個艱難的決定--支援更多人使用的語言/平台,亦或支援更多的語言/平台而放棄某個特性。

當協議的制定者決定為某種語言或平台提供更多支援的時候,對於使用者而言,協議的強健性就被犧牲了。

序列化和反序列化的資料正確性和業務正確性的除錯往往需要很長的時間,良好的除錯機制會大大提高開發效率。序列化後的二進位制串往往不具備人眼可讀性,為了驗證序列化結果的正確性,寫入方不得同時撰寫反序列化程式,或提供乙個查詢平台--這比較費時;另一方面,如果讀取方未能成功實現反序列化,這將給問題查詢帶來了很大的挑戰--難以定位是由於自身的反序列化程式的bug所導致還是由於寫入方序列化後的錯誤資料所導致。

對於跨公司間的除錯,由於以下原因,問題會顯得更嚴重:

第一、支援不到位,跨公司除錯在問題出現後可能得不到及時的支援,這大大延長了除錯週期。

第二、訪問限制,除錯階段的查詢平台未必對外公開,這增加了讀取方的驗證難度。

如果序列化後的資料人眼可讀,這將大大提高除錯效率, xml和json就具有人眼可讀的優點。

效能包括兩個方面,時間複雜度和空間複雜度:

第一、空間開銷(verbosity), 序列化需要在原有的資料上加上描述字段,以為反序列化解析之用。如果序列化過程引入的額外開銷過高,可能會導致過大的網路,磁碟等各方面的壓力。對於海量分布式儲存系統,資料量往往以tb為單位,巨大的的額外空間開銷意味著高昂的成本。

第二、時間開銷(complexity),複雜的序列化協議會導致較長的解析時間,這可能會使得序列化和反序列化階段成為整個系統的瓶頸。

移動互聯時代,業務系統需求的更新週期變得更快,新的需求不斷湧現,而老的系統還是需要繼續維護。

如果序列化協議具有良好的可擴充套件性,支援自動增加新的業務字段,而不影響老的服務,這將大大提供系統的靈活度。

如果使用的序列化協議沒有相容而成熟的http傳輸層框架支援,可能會導致以下三種結果之一:

第一、因為訪問限制而降低服務可用性。

第二、被迫重新實現安全協議而導致實施成本大大提高。

第三、開放更多的防火牆埠和協議訪問,而犧牲安全性。

IO流學習總結(下) 序列化 反序列化

序列化目的 序列化一般是指把結構化的物件變成無結構的位元組流,便於儲存 傳輸 物件的序列化 將記憶體中的物件直接寫入到檔案裝置中 物件的反序列化 將檔案裝置中持久化的資料轉換為記憶體物件 序列化前提 如果物件需要被寫出到檔案上,那麼物件所屬的類必須要實現serializable介面。serializ...

序列化(序列化)

原書上翻譯為序列化,msdn翻譯為序列化 作用 當需要儲存,或者網路傳輸 remoting時,資料 物件或值 需要序列化 類似於打包傳輸檔案。system.serializableattribute 序列化是指儲存和獲取磁碟檔案 記憶體或其他地方中的物件。在序列化時,所有的例項資料都儲存到儲存介質上...

序列化(模型序列化 序列化巢狀)

from rest framework import serializers from meituan.models import merchant,class merchantserializer serializers.modelserializer class meta model merch...