每当需要存储或通过网络发送Python对象时,它首先进行序列化。我猜这是因为存储和网络传输都基于比特。我有一个愚蠢的问题,更像是计算机科学基础问题而不是Python问题。当Python对象在缓存中时,它们采用什么样的格式?难道它们不应该表示为比特吗?如果是这样,为什么不直接使用这些比特来存储或发送对象,而要费心进行序列化?
比特表示
同一对象在不同机器上的 位 表示可能会不同:
因此,在发送方机器上的对象表示可以意味着在接收方上什么都没有(或更糟的是,可能意味着其他内容)。
以简单整数1025为例说明这个问题:
00000000 00000000 00000100 00000001
0x00000401
00000001 00000100 00000000 00000000
0x01040000
这就是为什么两台机器必须达成协议、约定。例如,对于IP协议,约定使用网络字节序(big-endian)。
关于字节序可以在这个问题中了解更多。
序列化(和反序列化)
我们无法直接将一个对象的基础 位表示 发送到网络上,原因如上所述,但不仅如此。
一个对象可以通过指针(第二个对象的内存地址)在内部引用另一个对象。此地址再次取决于平台。
Python 使用一种称为 pickling 的序列化算法来解决这个问题,该算法将对象层次结构转换为字节流。当这个字节流通过网络发送时,它仍然是平台相关的,因此需要协议以便于两端互相理解。