每當Python對象需要被存儲或通過網絡發送,則第一串行化。我想原因是存儲和網絡傳輸都是基於比特的。我有一個愚蠢的問題,這更像是一個計算機科學基礎問題,而不是Python問題。 python對象在緩存時採取什麼樣的格式?他們不應該把自己表現爲位麼?如果是這樣,爲什麼不使用這些位來存儲或發送對象,爲什麼還要串行化呢?Python數據持久性
回答
比特表示
相同對象可以在位有不同的表示在不同的機器:
- 想到字節序(字節順序)
- 和架構( 32位,64次叮咬)
所以在發送者機器上位的對象表示可能意味着什麼,(或者更糟可能意味着別的東西)的接收器接收時。
以一個簡單的整數,1025,作爲問題的說明:
- 在大端機位表示爲:
- 二進制:
00000000 00000000 00000100 00000001
- 十六進制:
0x00000401
- 二進制:
- ,同時在小端米achine:
- 二進制:
00000001 00000100 00000000 00000000
- 十六進制
0x01040000
- 二進制:
這就是爲什麼要了解對方,2臺機器有一個約定,協議達成一致。對於IP協議,慣例是使用網絡字節順序(big-endian)。
更多關於字節序in this question
序列化(和反串行化)
我們不能直接發送的對象在網絡上的底層比特表示,對於前面描述的原因,但不是唯一的。
一個目的可以參考另一個目的,在內部,通過指針(該第二對象的內存地址)。這個地址又是平臺相關的。
Python使用稱爲的酸洗的序列化算法解決此問題,該算法將對象層次轉換爲字節流。這個字節流在通過網絡發送時仍然依賴於平臺,這就是爲什麼兩端需要協議才能相互理解。
這是否意味着python序列化,例如pickle進程把這些比特轉換成另一種可以被所有機器普遍理解的比特格式?在高層次上,你可以介紹一下這是如何實現的嗎? –
@David我更新了我的答案,並簡單說明了序列化的python方式,酸洗 – arainone
只是做了你所說的,將註釋分成兩部分。爲了更好地理解這個想法,我可以做出這樣的比喻。使用不同位表示的機器就像兩個使用不同長度單位的國家。例如,A國使用腳,而B國使用passus。兩國都知道如何轉換自己的單位和通常知道的長度單位米。 A國要求B國製造1英尺長的東西。這是不可能的,因爲B國沒有人明白1英尺有多長。 –
爲I/O的關鍵點是實現interoperability,例如您通過網絡發送的JSON可能需要通過HTTP協議傳輸,然後通過JavaScript進行解析。在下次運行Python時(不同的運行時環境,內存分配等),存儲在磁盤上的數據可能需要可讀。
但是,對於代碼執行,通常希望實現比使用可互操作格式可能實現的要高的performance。使用內存位置地址訪問對象方法,字典項目...或儘可能優化processor cache。
有關詳細信息python是如何實現的,您可以查看interpreter implementations之一。
- 1. 數據持久性
- 2. 持久性數據
- 3. Python持久性Popen
- 4. Python的持久性
- 5. 高分數據持久性?
- 6. Symfony2,Doctrine數據持久性
- 7. Angular 2數據持久性
- 8. LDAP和持久性數據?
- 9. 數據持久性ViewPager
- 10. AIR 2 - 數據持久性?
- 11. SWFAddress和數據持久性
- 12. localStorage數據持久性
- 13. Android數據持久性
- 14. Android數據持久性
- 15. jqMobi的數據持久性
- 16. 持久性Java數據庫
- 17. Backbone.js數據持久性
- 18. Python的持久性名錄
- 19. Python註冊表持久性
- 20. 持久性python子進程
- 21. Python對象持久性
- 22. 實現Python持久屬性
- 23. 什麼線程安全的數據持久性對象在Python中可用於數據持久性?
- 24. D中的自動數據持久性
- 25. Android上的數據持久性替代
- 26. 迅速IOS數據持久性的UIImage
- 27. Web服務中的數據持久性?
- 28. 帶核心數據的UIBezierPath持久性
- 29. 問題與NSSearchPathForDirectoriesInDomains和持久性數據
- 30. 數據庫中的持久性
快速回答:您提到的*位*應該與平臺高度相關。 – starrify
@starrify。你能解釋一下嗎?或者你可以給我看一篇文章或書籍來解釋這一點嗎?謝謝! –