Python序列化是将对象转换为可存储或传输的形式的过程,常用于网络传输或数据的存储。Python支持多种序列化模块,最常用的是pickle和json模块。
pickle模块
pickle是Python内置的一个序列化模块,它可以将Python对象转化为二进制格式的字节流,也可以将字节流转化为Python对象。pickle模块可以序列化的对象包括:None、True、False、整数、浮点数、复数、字符串、字节串、元组、列表、集合、字典以及用户自定义类的实例等。
序列化过程
pickle的序列化过程可以用以下代码实现:
import pickle
data = {'name': 'Jack', 'age': 18, 'gender': 'male'}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
其中,pickle.dump(obj, file, protocol=None, *, fix_imports=True)方法将对象序列化后存储到文件中,obj参数是被序列化的Python对象,file参数是存储序列化结果的文件对象,protocol参数表示协议版本(0、1、2、3),默认为最高版本的协议,fix_imports参数表示是否支持旧的Python模块导入机制,默认为True。
反序列化过程
pickle的反序列化过程可以用以下代码实现:
import pickle
with open('data.pkl', 'rb') as f:
data = pickle.load(f)
print(data)
其中,pickle.load(file, *, fix_imports=True, encoding=”ASCII”, errors=”strict”)方法可以从文件中读取序列化结果并反序列化为Python对象。
示例说明
以下是序列化一个自定义类的示例:
import pickle
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def say_hello(self):
print("Hello, my name is %s" % self.name)
person = Person('Jack', 18, 'male')
with open('person.pkl', 'wb') as f:
pickle.dump(person, f)
with open('person.pkl', 'rb') as f:
p = pickle.load(f)
p.say_hello()
以上代码定义了一个Person类,包含name、age和gender三个属性以及say_hello方法,然后实例化一个对象person,并将其序列化保存到文件person.pkl中。接着从文件中读取序列化结果,反序列化为Person类的实例p,并调用其say_hello方法。
json模块
json是一种轻量级的数据交换格式,与pickle相比,它不仅可以序列化Python对象,还可以序列化存储到Python中的JSON类型的数据。json序列化后的结果是一个字符串,而不是二进制格式的字节流。json序列化支持的对象包括:None、bool、int、float、str、list、tuple和dict等。
序列化过程
json的序列化过程可以用以下代码实现:
import json
data = {'name': 'Jack', 'age': 18, 'gender': 'male'}
with open('data.json', 'w') as f:
json.dump(data, f)
其中,json.dump(obj, fp, , skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, *kw)方法将对象序列化为JSON格式的字符串并存储到文件中,obj参数是被序列化的Python对象,fp参数是存储序列化结果的文件对象,其他参数表示序列化的相关配置。
反序列化过程
json的反序列化过程可以用以下代码实现:
import json
with open('data.json', 'r') as f:
data = json.load(f)
print(data)
其中,json.load(fp, , cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, *kw)方法可以从文件中读取序列化结果并反序列化为Python对象。
示例说明
以下是序列化一个包含自定义类的字典的示例:
import json
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def say_hello(self):
print("Hello, my name is %s" % self.name)
person1 = Person('Jack', 18, 'male')
person2 = Person('Tom', 22, 'female')
data = {'person1': person1.__dict__, 'person2': person2.__dict__}
with open('data.json', 'w') as f:
json.dump(data, f)
with open('data.json', 'r') as f:
data = json.load(f)
person1 = Person(**data['person1'])
person1.say_hello()
以上代码定义了一个Person类,包含name、age和gender三个属性以及say_hello方法,然后实例化两个对象person1和person2,将它们的属性字典构成一个字典data,然后将该字典序列化为JSON格式的字符串并保存到文件data.json中。接着从文件中读取序列化结果,反序列化为Python字典,最后通过字典中的属性构建新的Person类的实例person1,并调用其say_hello方法。