python中的序列化——从pickle模块到json模块的扩展

本文探讨了Python中序列化的概念,包括将不可直接存储的数据转化为可存储形式。指出了encode()和decode()方法仅限于字符串转化的局限性,并介绍了pickle模块如何扩展此功能,能处理各种类型数据的字节流转换,以及其主要方法。进一步,文章阐述了json库如何在pickle基础上扩展,成为广泛认可的数据交换格式,支持所有基本类型转换,且与其他协议兼容。
前言

python序列化:
把不能够直接储存的数据变为可储存,这个过程叫序列化。
反序列化:
把存储的数据转化为原数据类型,这个过程叫反序列化。

encode() 和 decode() 的局限性

在python基础函数中,对数据的保存需要将字符串转化为字节流才能保存到文件中。
encode()将字符串转化为字节流,decode()将字节流转化为字符串,但都只局限于对字符串进行转化。

res_b = '我爱你'.encode('utf-8')
print(res_b, type(res_b))

res = res_b.decode('utf-8')
print(res, type(res))

# 结果:
# b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0' <class 'bytes'>
# 我爱你 <class 'str'>

如果对字符串以外的数据类型调用encode()decode(),则报错。

lst = ['我', '爱', '你']
res = lst.encode('utf-8')

# AttributeError: 'list' object has no attribute 'encode'
pickle模块对数据转换字节流的扩展

pickle模块解决了encode()decode()的局限性。
pickle能将不同类型数据转换为字节流保存在文件中,并且读取后能还原为原数据类型,方便对数据的调用。
pickle.dumps(object)pickle.loads(byte):对数据进行操作。

import pickle


def func1():
    print("我爱你")


# 对数据进行操作
res_b = pickle.dumps(func1)  # 将数据转换为字节流
print(res_b, type(res_b))

res1 = pickle.loads(res_b)  # 将字节流转换回原数据
print(res1, type(res1))

# 结果
# b'\x80\x03c__main__\nfunc1\nq\x00.' <class 'bytes'>
# <function func1 at 0x000001A3E16F2EA0> <class 'function'>

pickle.dump(object, io)pickle.load(byte):与文件IO的交互操作

import pickle


def func1():
    print("我爱你")


# 对文件进行操作
pickle.dump(func1, open('1.txt', 'wb+'))  # 转换数据后写进IO流文件中

res2 = pickle.load(open('1.txt', 'rb+'))  # 直接读取IO流数据转换为原数据并返回
print(res2, type(res2))

# 结果
# <function func1 at 0x000001A3E16F2EA0> <class 'function'>
json库对pickle模块的扩展

json是普遍遵守的文件传输格式,而且能将所有基本类型转换为字节流,并且能将字节流还原为原数据类型,继承了pickle模块所有功能的同时被大众类似协议相互遵守使用。

import json
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值