zoukankan      html  css  js  c++  java
  • 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'x80x03c__main__
    AA
    qx00)x81qx01.'
    
    >>> 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'x80x03c__main__
    AAA
    qx00)x81qx01}qx02Xx04x00x00x00ttttqx03Xx03x00x00x00abcqx04sb.'
    >>> 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)
  • 相关阅读:
    实验四 Android开发基础
    20135322实验五实验报告
    Eclipse中Ant的配置与测试
    实验三 敏捷开发与XP实践
    实验二 Java面向对象程序设计
    Java实验报告一:Java开发环境的熟悉
    简单四则运算
    个人介绍
    团队冲刺第一阶段个人工作总结2
    团队冲刺第一阶段个人工作总结1
  • 原文地址:https://www.cnblogs.com/jiangzuofenghua/p/11386484.html
Copyright © 2011-2022 走看看