python 序列化

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格式的序列化方式更加通用、易于阅读和编写,在多种编程语言和平台上都有广泛的应用。

后端开发标签