我们把变量从内存中变成可存储或传输的过程称>之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
序列化有两种方式
1、序列成二进制
2、序列成json
1、序列成二进制——pickle模块
dumps()、loads()用于字符串等的序列化和反序列化
import pickle
name = "hello"
name_dump = pickle.dumps(name)
name_load = pickle.loads(name_dump)
dump()、load()用于文件写读的序列化和反序列化
import pickle
name = "hello"
# 序列化写入文件
with open("info.txt","wb") as f:
pickle.dump(name,f)
# 反序列化读取文件
with open("info.txt","rb") as f:
pickle.loads(f)
2、序列成json——json模块
与pickle模块相似,dumps()、loads()用于字符串等的序列化和反序列化,dump()、load()用于文件写读的序列化和反序列化。
Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化:
class Teacher(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 将对象转为字典
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
# 将字典转为对象
def dict2student(std_dict):
return Student(std_dict['name'], std_dict['age'], std_dict['score'])
std = Student('Bob', 20, 88)
std_dict = json.dumps(std, default=student2dict)
# std_dict = json.dumps(std, default=lambda obj: obj.__dict__)
print(std_dict)
std2 = json.loads(std_dict, object_hook=dict2student)
print(std2)
拓展
在Django中的序列化:django.core.serializers中的serialize()方法
hero_list = serialize('json',my_page.object_list,ensure_ascii=False)
小结
Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。
json模块的dumps()和loads()函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。
网友评论