Python数据持久化

2024-04-24 23:32:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 对象网络序列化格式费心原因基础计算机科学
2条回答

位表示

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

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

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

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

  • 在Big-Endian机器上,表示为:
    • 二进制:00000000 00000000 00000100 00000001
    • 十六进制:0x00000401
  • 当你在一个小小的Endian机器上时:
    • 二进制:00000001 00000100 00000000 00000000
    • 十六进制0x01040000

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

更多关于endianness in this question

序列化(和反序列化)

由于前面描述的原因,我们不能直接在网络上发送位表示的对象。在

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

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

Pickle module documentation

I/O的关键点是实现interoperability,例如,您通过网络发送的JSON可能需要通过HTTP协议传输,然后由JavaScript解析。下一次运行Python时,存储在磁盘上的数据可能需要可读(不同的运行时环境、内存分配等)。在

但是对于代码执行,您通常希望实现比使用可互操作格式更高的performance,例如使用内存位置地址访问对象方法、dict项、。。。或者尽可能优化processor cache。在

关于python具体是如何实现的,您可以看看interpreter implementations中的一个。在

相关问题 更多 >