簡體   English   中英

序列化:將字節轉換為字節?

[英]Serialization: Converting bytes to bytes?

對象本身是一個字節序列,這就是機器如何理解所有數據,無論是對象,文本,圖像等。 您能否為我清除這個想法,為什么我們要將一個字節序列(對象)轉換為另一個字節? 在進行序列化時,我們是否重組字節,還是制作一個包含該對象的模板以在通過網絡傳輸時賦予它特殊的含義? 假設某種方法將對象直接從內存中取出,然后將該對象放入IP數據報中並通過網絡發送,可能會發生什么問題?

第一:壓縮。

您必須了解,磁盤上的映像文件和從內存呈現的映像文件是不同的。 在磁盤上,它們(通常不用擔心BMP)被壓縮。 利用當前的網絡吞吐量和硬盤的容量,壓縮是必不可少的。

第二:建築。

內存中的數字只是一個位序列,是的。 但是,什么位數算作數字呢? 8? 16嗎 32? 64嗎? 任何一位。 有字節,單詞,整數,長整數,浮點數(地獄,浮點數!),還有另外幾十個。 位序也很重要,所謂的大端和小端。 因此,一台(x86)機器上的123456789與另一台機器(例如x64)上的數字不同。

第三:文件(讀取:傳輸)格式!=內存中對象格式。

嗯,文件(或網絡數據包)中的數據結構與從該文件中的對象加載到內存中的時間之間存在差異。 此外,不同程序版本的內存對象結構也可能不同。 在Win 3.1中,加載到內存的映像以及其他功能,Vista是一個巨大的區別。 同樣,結構打包和4位,8位,16位,32位邊界對齊等,等等。

對象本身包含許多引用 ,這些引用是指向該對象在該特定時刻恰好在該計算機上內存中存在該對象的另一個組件的位置的指針 序列化的要點是它將對象轉換為可以在其他時間(可能在其他計算機上)讀取的字節。

此外,內存中的對象表示已針對快速訪問和修改進行了優化,而不必占用最少的字節數。 一些序列化協議(尤其是用於RPC或數據存儲中的序列化協議)使用壓縮算法來優化必須傳輸或存儲多少個字節,從而使訪問或修改對象的屬性變得更加困難,以換取使用更少的字節來完成操作。

對象本身是一個字節序列

否。對象本身只是一個“字節序列”,除非它只包含原始數據。 它可以包含

  • 引用其他對象
  • 這些對象可能已經被序列化,在這種情況下,需要對反向引用進行序列化,而不是再次對被引用的對象進行序列化
  • 這些引用可能為空
  • 可能根本沒有對象,只有原始數據

所有這些事情大大增加了任務的復雜性,遠遠超出了僅序列化“字節序列”的幼稚概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM