2024-04-24 23:32:55 发布
网友
每当Python对象需要通过网络存储或发送时,它首先被序列化。我想原因是存储和网络传输都是基于位的。我有一个愚蠢的问题,它更像是一个计算机科学基础问题而不是一个Python问题。python对象在缓存中采用什么格式?他们不应该把自己当作比特来表现吗?如果是这样的话,为什么不直接使用这些位来存储或发送对象,为什么还要费心序列化呢?在
位表示
在不同的机器上,同一对象的位可以有不同的表示:
因此,在发送方机器上以位表示的对象在接收端接收时可能没有任何意义(或者更糟的是可能意味着其他东西)。在
以一个简单的整数1025作为问题的说明:
00000000 00000000 00000100 00000001
0x00000401
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中的一个。在
位表示
在不同的机器上,同一对象的位可以有不同的表示:
因此,在发送方机器上以位表示的对象在接收端接收时可能没有任何意义(或者更糟的是可能意味着其他东西)。在
以一个简单的整数1025作为问题的说明:
00000000 00000000 00000100 00000001
0x00000401
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中的一个。在
相关问题 更多 >
编程相关推荐