详解Python 序列化结果

  • Post category:Python

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方法。