gpt4 book ai didi

Python 数据持久化

转载 作者:太空宇宙 更新时间:2023-11-03 15:04:07 24 4
gpt4 key购买 nike

每当 Python 对象需要存储或通过网络发送时,它首先被序列化。我猜是因为存储和网络传输都是基于比特的。我有一个愚蠢的问题,它更像是计算机科学基础问题而不是 python 问题。 python对象在缓存中时采用哪种格式?他们不应该将自己表示为位吗?如果是这样,为什么不直接使用这些位来存储或发送对象,为什么还要麻烦序列化呢?

最佳答案

位表示

同一个对象在不同的​​机器上可以有不同的表示:

  • 考虑字节顺序(字节顺序)
  • 架构(32位,64位)

因此,在发送方机器上以 Bit 表示的对象表示在接收方机器上可能没有任何意义(或者更糟糕的可能意味着其他东西)。

以一个简单的整数 1025 为例说明问题:

  • 在 Big Endian 机器上,Bits 表示是:
    • 二进制:00000000 00000000 00000100 00000001
    • 十六进制:0x00000401
  • 在 Little Endian 机器上:
    • 二进制:00000001 00000100 00000000 00000000
    • 十六进制 0x01040000

这就是为什么要相互理解,两台机器必须就约定、协议(protocol)达成一致。对于IP协议(protocol),惯例是使用网络字节序(big-endian)为例。

更多关于字节顺序 in this question

序列化(和反序列化)

我们不能直接在网络上发送底层位表示的对象,原因如上所述,但不仅限于此。

一个对象可以在内部通过指针(第二个对象的内存地址)引用另一个对象。此地址同样平台相关

Python 使用称为 pickling 的序列化算法解决了这个问题,该算法将对象层次结构转换为字节流。这种字节流在通过网络发送时仍然依赖于平台,这就是为什么两端需要一种协议(protocol)来相互理解的原因。

Pickle module documentation

关于Python 数据持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34840535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com