序列化与反序列化
发布日期:2021-05-10 03:53:12 浏览次数:9 分类:精选文章

本文共 2087 字,大约阅读时间需要 6 分钟。

序列化(pickling)

  把变量从内存中变成可存储或传输的过程反序列化(unpickling)
  把变量内容从序列化的对象重新读到内存里的过程

序列化&反序列化的意义

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

实例

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

  import pickle  d = dict(name='Bob', age=20, score=88)  bytes = pickle.dumps(d)     #把对象序列化成一个bytes  print(bytes)       #输出: b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'  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'\x80\x03c__main__\nPerson\nq\...'    p = pickle.loads(person_abc)    p.work()   #输出:abc is working...    # 将类本身存储在变量中,loads的时候返回类本身,而非它的一个实例    class_Person = pickle.dumps(Person)    print(class_Person)    #输出:b'\x80\x03c__main__\nPerson\nq\x00.'    Person = pickle.loads(class_Person)    print(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保存那些不重要的数据,不能成功地反序列化也没关系

  反序列化后的对象是一个新的对象

上一篇:English
下一篇:常用概念

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月13日 05时20分03秒