大家都不陌生,是说把内存中变量变成可存储或传输的过程;python中称之pickle序列化后即可存储到磁盘或传输,反序列化即将磁盘中的信息重新读到内存中。python中实现序列化模块 pickle,如下:

import pickle
dic =dict(name="张三丰",age=18,score=90)
info=pickle.dumps(dic)
print(info)
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\t\x00\x00\x00\xe5\xbc\xa0\xe4\xb8\x89\xe4\xb8\xb0q\x02X\x03\x00\x00\x00ageq\x03K\x12X\x0
5\x00\x00\x00scoreq\x04KZu.'

序列化,并写入文件:

f=open('./log','wb')
pickle.dump(dic,f)
f.close()

序列化内容被写入log文件

注释pickle.dumps()方法把任意对象序列化成一个bytespickle.dump()直接把对象序列化后写入一个file-like Object

我们重新把文件中内容读到内容中:

import pickle
f=open('./log','rb')
d=pickle.load(f)
f.close()
print(d)
{'name': '张三丰', 'age': 18, 'score': 90}

json:

如果要在不同语言之间传递对象,必须为标准传输格式 xml或json

JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下

JSON类型 Python类型
{} dict 字典
[] list 列表
string str 字符串
float int 或float
true/false true /false
none None

Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。我们先看看如何把Python对象变成一个JSON:

import json
dic=dict(name="张三丰",age=18,score=90)
print(json.dumps(dic))
{"name": "\u5f20\u4e09\u4e30", "age": 18, "score": 90}

写入文件:

import json
f=open('./log','w')
dic=dict(name="张三丰",age=18,score=90)
json.dump(dic,f)
f.close()
#文件内形式{"name": "\u5f20\u4e09\u4e30", "age": 18, "score": 90}

json的进阶:

Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化:

import json
class Student(object):
    """docstring for ."""

    def __init__(self, name,age,score):
        self.name =name
        self.age =age
        self.score=score
s=Student('houger',20,90)
print(json.dumps(s))
TypeError: Object of type Student is not JSON serializable

运行如上代码,会出现TypeError,Student 类对象不可以直接序列化为json

dumps()方法的参数列表,可以发现,除了第一个必须的obj参数外,dumps()方法还提供了一大堆的可选参数:

前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps()方法不知道如何将Student实例变为一个JSON的{}对象。

可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可。

def student2dic(std):
    return {
     'name':std.name,
     'age':std.age,
     'score':std.score
    }

这样,Student实例首先被student2dict()函数转换成dict,然后再被顺利序列化为JSON

print(json.dumps(s,default=student2dic))
{"name": "houger", "age": 20, "score": 90}

总结:

Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。

json模块的dumps()loads()函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。


Leave Your Comment

电子邮件地址不会被公开。 必填项已用*标注