序列化

作者: 临渊如峙 | 来源:发表于2019-02-01 14:51 被阅读0次

我们把变量从内存中变成可存储或传输的过程称>之为序列化,在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()函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。

相关文章

网友评论

      本文标题:序列化

      本文链接:https://www.haomeiwen.com/subject/gbhuyftx.html