python的序列化和反序列化


一、序列化和反序列化

1、为什么要序列化

  • 内存中的字典,链表如何保存到一个文件中
  • 如果是自己定义的类的实例,如何保存到一个文件中
  • 如何从文件中读取数据,并让它们在内存中再次变成自己对应的类的实例
  • 要设计一套协议,按照某种规则,把内存中数据保存到文件中,文件是一个字节序列,所以必须 把数据转换成字节序列,输出到文件,这就是序列化,反之,从文件的字节序列恢复到内存中,这就是反序列化

2、序列化(serialization)的定义

  • 将内存中的对象存储下来,把它变成一个个字节--》即二进制
  • 序列化就是把数据保存到文件,就是持久化
  • 可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者网络接收到的字节反序列化

3、反序列化(deserialization)的定义

  • 将文件的一个个字节恢复成内存中的对象 《-----即二进制文件变成字符

二、序列化和反序列化模块

  • python中提供了pickle库序列化和反序列化模块
  • 1、dumps对象序列化模块
  • 2、dump对象序列化到文件对象,就是存入文件
  • 3、loads对象反序列化
  • 4、load对象反序列化,从文件读取数据

三、文件序列化和反序列化

>>> import pickle
>>> with open(file,'wb') as f:
    s1 = 99
    s2 = 'abc'
    s3 = ['a','b',['c','d']]
    #序列化
    pickle.dump(s1,f)
    pickle.dump(s2,f)
    pickle.dump(s3,f)

    #反序列化
>>> with open(file,'rb') as f:
    s = []
    for i in range(3):
        s.append(pickle.load(f))

        
>>> print(s)
[99, 'abc', ['a', 'b', ['c', 'd']]]
>>> 

四、对象序列化

1、对象序列化

>>> class AA:
    ttt = 'ABC'
    def show(self):
        print('abc')
        
>>> a1 = AA()
>>> sr = pickle.dumps(a1)  #序列化对象
>>> print('sr={}'.format(sr))
sr=b'\x80\x03c__main__\nAA\nq\x00)\x81q\x01.'

>>> a = pickle.loads(sr)  # 反序列化对象
>>> print(a.ttt)
ABC
>>> 

上面的例子中,其实就是保存了一个类名,因为所有的其他东西都是类定义的,是不变的 
所以只序列化AA类名,反序列化的时候找到类就可以恢复一个对象
    


2、对象序列化改进

对象序列化2
>>> class AAA:
    def __init__(self):
        self.tttt = 'abc'
    
>>> b1 = AAA()
>>> sr = pickle.dumps(b1)
>>> print('sr={}'.format(sr))
sr=b'\x80\x03c__main__\nAAA\nq\x00)\x81q\x01}q\x02X\x04\x00\x00\x00ttttq\x03X\x03\x00\x00\x00abcq\x04sb.'
>>> b2 = pickle.loads(sr)
>>> print(b2.tttt)
abc
>>>     
    
上面例子可以看出这回保存了AAA,tttt和abc,因为这才是每一个对象每次都变化的
但是,反序列化的时候要找到AAA类的定义才能成功,否则会抛异常
可以这样理解:反序列化的时候,类是模子,二进制序列就是铁水


3、序列化的应用

  • 一般来说,大多数场景都是应用在网络中,将数据序列化后通过网络传输到远程节点
  • 远程服务器上的服务将接收到的数据反序列化后,就可以使用了
  • 但是,要注意一点,远程接收端,反序列化时必须有对应的数据类型,否则会报错

五、JSON

  • JSON 是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据

1、Json的数据类型

  • 值(value):双引号引起来的字符串,数值,true和false,null,对象,数组等这些都是值
  • 字符串:由双引号包围起来的任意字符的组合,可以有转义字符
  • 数值:有正负,有整数,浮点数
  • 对象:无序的键值对的集合,格式:{key1:value,...keyn:valuen},value可以是任意合法的值
  • 数组:有序的值的集合,格式[val1,...valn]

2、json模块常用方法

  • dumps json编码
  • dump json编码并存入文件
  • loads json解码
  • load json解码,从文件读取数据
举例:
import json
d = {
    'name':'Tom',
    'age':20,
    'interest':['music','movie']
}

j = json.dumps(d)
print(j)
d1 = json.loads(j)
print(d1)

一般json编码的数据很少落地,数据都是通过网络传输,传输的时候要考虑压缩
本质上来说它就是个文本,就是个字符串,json很简单,几乎语言编程都支持json


六、MessagePack

  • 是一个基于二进制高效的对象序列化类库,可用于夸语言通信
  • 他可以像json那样,在许多种语言之间交换结构对象,但是它比json更快速也轻巧
    
pip install msgpack-python安装
常用方法
packb 序列化对象,提供了dumps来兼容pickle和json
unpackb反序列化对象,提供了loads来兼容

pack序列化对象保存在文件对象,提供了dump来兼容
unpack反序列化对象保存到文件对象,提供了load来兼容

import mspack
d = {
    'name':'Tom',
    'age':20,
    'interest':['music','movie']
}
b = msgpack.packb(d)
print(len(b))
print(b)

d1 = msgpack.unpackb(b)
print(d1)

d1 = msgpack.unpackb(b,encoding='utf-8')
print(d1)

优质内容筛选与推荐>>
1、jquery.masonry + jquery.infinitescroll 实现瀑布流布局
2、前端框架VUE----补充
3、Redis Install
4、第一次团队作业:小盘子的小组初长成
5、圣思园java se培训总结(91-)(过滤流)


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn