### Python内置的数据结构是直接可以被序列化的:
字典、元组、列表、集合、字符串、整形、浮点型、布尔类型。
### 如果自己定义的对象想要能够被序列化,那么必须实现以下两个魔术方法:
1. `__getstate__`:当这个对象被序列化的时候,会调用这个方法,然后将这个方法的返回值存储到硬盘中。这个方法的返回值必须是可序列化的。
2. `__setstate__`:当从硬盘中加载一个对象的时候,会调用这个方法,并且将加载到的数据作为参数传递给这个方法。拿到这个数据后,就可以做自己的事情了,比如将之前的数据重新保存到这个对象上。
#encoding: utf-8
import pickle
def dump_built_in_obj():
data = {'foo': [1, 2, 3],
'bar': ('Hello', 'world!'),
'baz': True}
with open('build_obj.pkl','wb') as fp:
pickle.dump(data,fp)
# dump_built_int_obj()
def load_built_in_obj():
with open('build_obj.pkl','rb') as fp:
t = pickle.load(fp)
print(t)
class Cat(object):
def __init__(self,name):
self.name = name
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __getstate__(self):
# 这个方法中,只能返回能被Pickle存储的数据结构
return {"name":self.name,'age':self.age}
def __setstate__(self, state):
print(state)
self.name = state['name']
self.age = state['age']
def __str__(self):
return "Person(name:%s,age:%d)" % (self.name,self.age)
def dump_obj():
p1 = Person('zhiliao',18)
with open('pickle_obj.pkl','wb') as fp:
pickle.dump(p1,fp)
def load_obj():
with open('pickle_obj.pkl','rb') as fp:
t = pickle.load(fp)
print(t)
load_obj()
网友评论