• 序列化与反序列化


    序列化(pickling)
      把变量从内存中变成可存储或传输的过程

    反序列化(unpickling)
      把变量内容从序列化的对象重新读到内存里的过程

    序列化&反序列化的意义
      在程序运行过程中,对象可在内存中被自由的修改
      一旦程序结束,对象所占内存会被系统回收,所做修改会全部丢失,要想在内存中将对象恢复到修改后状态,就只能重新运行程序进行修改
      通过序列化和反序列化,就可把对象某一时刻在内存中的内容状态同步到磁盘,或通过网络传输到别的机器上最为一个记录
      当想在内存中恢复该对象在那一时刻的状态时,就可通过将磁盘或其他机器上记录的对象状态反序列化至内存,而无需重新运行程序

    实例

       序列化与反序列化(字节码)

      import pickle
    
      d = dict(name='Bob', age=20, score=88)
      bytes = pickle.dumps(d)     #把对象序列化成一个bytes
      print(bytes)    
    #输出: b'x80x03}qx00(Xx03x00x00x00ageqx01Kx14Xx05x00x00x00scoreqx02KXXx04x00x00x00nameqx03Xx03x00x00x00Bobqx04u.'   d1 = pickle.loads(bytes) #把bytes反序列化出对象   print(d1) #输出:{'age': 20, 'score': 88, 'name': 'Bob'}

      序列化与反序列化(二进制文件)

      import pickle
      d = dict(name='Bob', age=20, score=88)
      f = open('dump.txt', 'wb')
      pickle.dump(d, f)     #把对象序列化后写入一个file-like Object
      f.close()
    
      f1 = open('dump.txt', 'rb')
      d1 = pickle.load(f)     #从一个file-like Object中直接反序列化出对象
      f1.close()    

       序列化与反序列化(自定义对象)

        import pickle
    
        class Person:
            def __init__(self, name, age, job):
                self.name = name
                self.age = age
                self.job = job
    
            def work(self):
                print(self.name, 'is working...')
    
        a_person = Person('abc', 22, 'waiter')
    
        person_abc = pickle.dumps(a_person)
        print(person_abc)   #输出:b'x80x03c__main__
    Person
    q...'
    
        p = pickle.loads(person_abc)
        p.work()   #输出:abc is working...
    
    
        # 将类本身存储在变量中,loads的时候返回类本身,而非它的一个实例
        class_Person = pickle.dumps(Person)
        print(class_Person)    #输出:b'x80x03c__main__
    Person
    qx00.'
    
        Person = pickle.loads(class_Person)
        print(Person)    #输出:<class '__main__.Person'>
    
        p = Person('Bob', 23, 'Student')  #反序列化后的Person类可以正常创建对象
        p.work()    #输出:Bob is working...
    
    
        with open('person.pkl', 'wb') as f:
            pickle.dump(Person, f)    #把Person类序列化到file-like object
    
        with open('person.pkl', 'rb') as f:
            Person = pickle.load(f)  #把Person类从file-like object反序列化到类
            aa = Person('gg', 23, '6')    #反序列化后的类可以正常创建对象
            aa.work()    #输出:gg is working...

    注意:

      不同版本的Python彼此都不兼容,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系
      反序列化后的对象是一个新的对象

  • 相关阅读:
    30130413 腾讯笔试
    未来网络 SDN
    XAML实例教程系列 XAML传递参数到值转换类实例
    【转】Silverlight MVVM 贴近实战(一)
    XAML实例教程系列 依赖属性和附加属性
    Silverlight开发工具汇总
    XAML实例教程系列 类型转换器(Type Converter)
    XAML实例教程系列 标记扩展(Markup Extensions)
    XAML实例教程系列 事件(Event)
    [转]XAML实例教程系列 命名空间(NameSpace)
  • 原文地址:https://www.cnblogs.com/shiliye/p/10571935.html
Copyright © 2020-2023  润新知