序列化與反序列化

序列化(pickling)
  把變量從內存中變成可存儲或傳輸的過程

反序列化(unpickling)
  把變量內容從序列化的對象從新讀到內存裏的過程網絡

序列化&反序列化的意義
  在程序運行過程當中,對象可在內存中被自由的修改
  一旦程序結束,對象所佔內存會被系統回收,所作修改會所有丟失,要想在內存中將對象恢復到修改後狀態,就只能從新運行程序進行修改
  經過序列化和反序列化,就可把對象某一時刻在內存中的內容狀態同步到磁盤,或經過網絡傳輸到別的機器上最爲一個記錄
  當想在內存中恢復該對象在那一時刻的狀態時,就可經過將磁盤或其餘機器上記錄的對象狀態反序列化至內存,而無需從新運行程序spa

實例code

   序列化與反序列化(字節碼)對象

  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'}

  序列化與反序列化(二進制文件)blog

  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)    #輸出:<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保存那些不重要的數據,不能成功地反序列化也不要緊
  反序列化後的對象是一個新的對象it

相關文章
相關標籤/搜索