首页 > 技术文章 > 模块之序列化模块详解

featherwit 2020-07-10 15:25 原文

序列化介绍

序列化指的是把内存的数据类型转换成一个特定的格式的内容, 该格式的内容可用于存储或者传输给其他的平台使用。

序列化的两种用途:

1. 持久保存状态: 将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

2. 跨平台数据交互: 不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

 

json模块详解

序列化

序列化采用的主要是json模块的dumps()方法以及dump()方法

import json

# 序列化
json_res = json.dumps([1, 'aaa', True, False])
print(json_res, type(json_res))  # "[1, "aaa", true, false]"


# 序列化的结果写入文件
with open('test.json', 'w', encoding='utf-8') as f:
    json.dump([1, 'aaa', True, False], f)

反序列化

反序列化采用的主要是json模块的loads()方法以及load()方法

import json

# 反序列化
l = json.loads(json_res)
print(l, type(l))


# 从文件读取json格式字符串进行反序列化操作:
with open('test.json', 'r', encoding='utf-8') as f:
    l = json.load(f)
    print(l, type(l))

 

pickle模块详解

json模块和pickle模块都有  dumps、dump、loads、load四种方法,而且用法一样。

不用的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,

而pickle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码

不过pickle可以序列化函数,但是其他文件想用该函数,在该文件中需要有该文件的定义(定义和参数必须相同,内容可以不同)

import pickle

res = pickle.dumps({1, 2, 3, 4, 5})
print(res, type(res))

s = pickle.loads(res)
print(s, type(s))

 

shelve模块

 shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型

import shelve

f=shelve.open(r'sheve.txt')
# f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
# f['stu2_info']={'name':'gangdan','age':53}
# f['school_info']={'website':'http://www.pypy.org','city':'beijing'}

print(f['stu1_info']['hobby'])
f.close()

 

推荐阅读