python之序列化反序列化



serialization序列化

    将内存中对象存储下来,把它变成一个个字节python

deserialization反序列化服务器

    将文件的一个个字节恢复成内存中对象。网络

序列化保存到文件就是持久化。能够将数据序列化后持久化,或者网络传输;也能够将从文件中或者网络接收到的字节序列反序列化。ide

python提供了pickle库。
对象


dumps:对象序列化内存

dump对象序列化到文件对象,就是存入文件;get

loads:对象反序列化it

load对象反序列化,从文件读取数据;io

import pickle


class AA:
    def show(self):
        print('abc')
        a = 'abcdefghigklmn'
        print(a)

aa = AA()


with open('bin', 'wb') as f:
    pickle.dump(aa, f)

with open('bin', 'rb') as f:
    tmp = pickle.load(f)
    print(tmp)
    tmp.show()

上面的实例中,其实就保存一个类名,由于全部的其余东西都是类定义的东西,是不变的,因此只序列化一个AA类名。反序列化的时候找到类就能够恢复一个对象。class

with open('bin', 'rb') as f:
    tmp = pickle.load(f)
    print(tmp)
    tmp.show()
    
AttributeError: Can't get attribute 'AA' on <module '__main__' from 'pic.py'>

上面这样会抛出异常;

class AA:
    def show(self):
        print(123)

aa = AA()
with open('bin', 'rb') as f:
    tmp = pickle.load(f)
    print(tmp)
    tmp.show()

反序列化的时候要找到AA类的定义,才能成功。增长定义类便可解决。哪怕这个AA类不同。


本地序列化的状况,应用较少;

通常来讲,大多数场景都应用在网络中。将数据序列化后经过网络传输到远程节点,远程服务器上的服务将收到的数据反序列化后,就能够使用了。

可是要注意一点,远程接收端,反序列化时候必须有对应的数据类型,不然就会报错。尤为是自定义类,必须远程得有。

相关文章
相关标签/搜索