2016-01-17 162 views
3

每當Python對象需要被存儲或通過網絡發送,則第一串行化。我想原因是存儲和網絡傳輸都是基於比特的。我有一個愚蠢的問題,這更像是一個計算機科學基礎問題,而不是Python問題。 python對象在緩存時採取什麼樣的格式?他們不應該把自己表現爲位麼?如果是這樣,爲什麼不使用這些位來存儲或發送對象,爲什麼還要串行化呢?Python數據持久性

+1

快速回答:您提到的*位*應該與平臺高度相關。 – starrify

+0

@starrify。你能解釋一下嗎?或者你可以給我看一篇文章或書籍來解釋這一點嗎?謝謝! –

回答

3

比特表示

相同對象可以在位有不同的表示在不同的機器:

  • 想到字節序(字節順序)
  • 架構( 32位,64次叮咬)

所以在發送者機器上的對象表示可能意味着什麼,(或者更糟可能意味着別的東西)的接收器接收時。

以一個簡單的整數,1025,作爲問題的說明:

  • 在大端機表示爲:
    • 二進制:00000000 00000000 00000100 00000001
    • 十六進制:0x00000401
  • ,同時在小端米achine:
    • 二進制:00000001 00000100 00000000 00000000
    • 十六進制0x01040000

這就是爲什麼要了解對方,2臺機器有一個約定,協議達成一致。對於IP協議,慣例是使用網絡字節順序(big-endian)。

更多關於字節序in this question

序列化(和反串行化)

我們不能直接發送的對象在網絡上的底層比特表示,對於前面描述的原因,但不是唯一的。

一個目的可以參考另一個目的,在內部,通過指針(該第二對象的內存地址)。這個地址又是平臺相關的

Python使用稱爲的酸洗的序列化算法解決此問題,該算法將對象層次轉換爲字節流。這個字節流在通過網絡發送時仍然依賴於平臺,這就是爲什麼兩端需要協議才能相互理解。

Pickle module documentation

+0

這是否意味着python序列化,例如pickle進程把這些比特轉換成另一種可以被所有機器普遍理解的比特格式?在高層次上,你可以介紹一下這是如何實現的嗎? –

+0

@David我更新了我的答案,並簡單說明了序列化的python方式,酸洗 – arainone

+0

只是做了你所說的,將註釋分成兩部分。爲了更好地理解這個想法,我可以做出這樣的比喻。使用不同位表示的機器就像兩個使用不同長度單位的國家。例如,A國使用腳,而B國使用passus。兩國都知道如何轉換自己的單位和通常知道的長度單位米。 A國要求B國製造1英尺長的東西。這是不可能的,因爲B國沒有人明白1英尺有多長。 –

1

I/O的關鍵點是實現interoperability,例如您通過網絡發送的JSON可能需要通過HTTP協議傳輸,然後通過JavaScript進行解析。在下次運行Python時(不同的運行時環境,內存分配等),存儲在磁盤上的數據可能需要可讀。

但是,對於代碼執行,通常希望實現比使用可互操作格式可能實現的要高的performance。使用內存位置地址訪問對象方法,字典項目...或儘可能優化processor cache

有關詳細信息python是如何實現的,您可以查看interpreter implementations之一。