1. 什么是序列化?
序列化是指将数据结构或对象,转换成可存储或传输的格式的过程。这个过程可以将结构化数据转化为纯文本格式,比如JSON、XML或者是二进制格式,比如Pickle等。反之,则称之为反序列化。
1.1 序列化的作用
序列化的主要作用有以下几个方面:
将数据保存至文件或数据库中,便于后续读取和使用;
将数据传输至网络中,让其它应用程序可以使用;
在多个进程或机器之间共享数据。
1.2 Python中的常用序列化方式
Python可以使用多种方式进行序列化,比如JSON、Pickle、YAML等。其中,JSON是目前最流行的序列化格式之一,不仅可以用于Python,还可以被多种编程语言支持;而Pickle则是Python自带的序列化方式,可以用于Python特有的对象序列化。下面,我们来介绍下Python中的两种序列化方式:
2. Pickle序列化
Python中,可以使用pickle模块进行对象的序列化和反序列化。Pickle可以将任意类型的Python对象转换成为一串由字节组成的序列。所以,它是Python语言独有的序列化方式。
2.1 Pickle的基本用法
使用Pickle进行序列化的基本用法如下所示:
import pickle
# 定义一个字典对象
d = {"name": "Bob", "age": 20, "gender": "male"}
# 将字典对象序列化为二进制数据
pickled_d = pickle.dumps(d)
# 将二进制数据反序列化为对象
unpickled_d = pickle.loads(pickled_d)
上面的代码中,pickle.dumps()方法将字典对象d序列化为二进制数据,pickle.loads()方法将二进制数据反序列化为对象。
2.2 Pickle的局限性
虽然Pickle是非常方便的序列化方式,但是它也有着一些局限性:
不能跨语言使用,因为只有Python可以理解Pickle序列化后的数据;
由于它是二进制序列化,所以序列化的数据比较难以阅读,也难以手动进行修改。
3. JSON序列化
Python中,可以使用json模块进行JSON格式的序列化和反序列化。JSON是一种轻量级的数据交换格式,易于阅读和编写,并且由于广泛应用于前端开发,所以它具有跨语言、跨平台的特性。
3.1 JSON的基本用法
JSON序列化和反序列化的基本用法如下所示:
import json
# 定义一个字典对象
d = {"name": "Bob", "age": 20, "gender": "male"}
# 将字典对象序列化为JSON格式的字符串
json_d = json.dumps(d)
# 将JSON格式的字符串反序列化为对象
unjson_d = json.loads(json_d)
上面的代码中,json.dumps()方法将字典对象d序列化为JSON格式的字符串,json.loads()方法将JSON格式的字符串反序列化为对象。
3.2 JSON的高级用法
JSON在序列化和反序列化时,还支持以下一些高级的操作:
3.2.1 序列化时指定缩进量
当我们需要将JSON数据写入到文件或者输出到控制台时,我们可以使用json.dump()方法,并指定缩进indent参数,让输出的JSON格式更加美观。
import json
# 定义一个字典对象
d = {"name": "Bob", "age": 20, "gender": "male"}
# 将字典对象序列化为JSON格式的字符串,并指定缩进量
json_d = json.dumps(d, indent=4)
# 将JSON格式的字符串写入到文件中
with open("data.json", "w") as f:
json.dump(json_d, f)
3.2.2 指定自定义的序列化方式
当我们需要序列化一些Python特有的对象时,比如datetime等,我们可以使用json.JSONEncoder类,并重写default()方法,实现自定义的序列化方式。
import datetime, json
# 定义一个时间对象
date = datetime.datetime.now()
# 自定义序列化函数
def date_handler(obj):
if isinstance(obj, datetime.datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
# 将时间对象序列化为JSON格式的字符串,并使用自定义序列化函数
json_date = json.dumps(date, default=date_handler)
# 将JSON格式的字符串反序列化为时间对象
unjson_date = json.loads(json_date)
4. 总结
本文主要介绍了Python中两种常见的序列化方式——Pickle和JSON,并且介绍了它们的基本用法和高级用法。
虽然Pickle是Python语言独有的序列化方式,但由于它的序列化数据比较难以阅读和编辑,所以在实际应用中较少使用。相比之下,JSON格式的序列化方式更加通用、易于阅读和编写,在多种编程语言和平台上都有广泛的应用。