1. 首先不管哪种语言都会用到序列化和反序列化的过程,
2. 序列化: 把对象转换为字节序列的过程称为对象的序列化; 反序列化: 把对象转换为字节序列的过程称为对象的序列化.
3. 序列化的作用: 把对象 (变量) 从内存中变成可存储或传输的二进制对象, 序列化之后的内容就可以写入磁盘, 或者通过网络传输到别的机器上, 同理, 反序列化实现, 把变量内容从序列化的对象重新读取到内存
4. 如何实现序列化? 比如我们要在不同的编程语言之间传递对象, 就必须把对象序列化为标准格式, 例如 xml,JSON.
JSON 是标准的 JavaScript 语言的对象, 其实就是字符串, 可以被所有语言读取, 也可以方便的存储到磁盘或者网络传输.
5.JSON 和 Python 的关系? 两者内置的数据类型对应关系如下
6. 在 python 中 JSON 只能转换一部分对象. 类, 函数无法转换, 就要用到 pickle, 但 pickle 只适用在 python 内部适用, shelve 模块也是 python 内部使用
举例说明
1. 想要把一个列表写进文件
- import JSON
- mq=[1,'e','r','m',4]
- with open('json_te','w') as fm:
- JSON.dump(mq,fm)
如下, 不调用 dumps 序列化, 则直接报错, write()的参数必须是 str 类型
- import JSON
- mq=[1,'e','r','m',4]
- #mq=JSON.dumps(mq)
- with open('json_te','w') as fm:
- fm.write(mq)
- #TypeError: write() argument must be str, not list
修改以上代码: 执行成功
- import JSON
- mq=[1,'e','r','m',4]
- mq=JSON.dumps(mq)
- with open('json_te','w') as fm:
- fm.write(mq)
2. 以上代码还可以用 dump 替代, 体现了 dump 和 dumps 之间的区别
- import JSON
- mq=[1,'e','r','m',4]
- with open('json_te','w') as fm:
- JSON.dump(mq,fm)
3. 对于从文件中读取该列表就体现了, 反序列化的过程, 如下过程, 直接读取出来的是 str, 程序把文件内容作为一个长的字符串
- import JSON
- with open ('json_te','r') as fn:
- con=fn.read()
- print(type(con)) #<class 'str'>
- print(con[2]) #'
4. 以下对比, 反序列化处理的结果
- import JSON
- with open ('json_te','r') as fn:
- con=fn.read()
- con=JSON.loads(con)
- print(type(con)) #<class 'list'>
- print(con[2]) # r
5. 反序列化的另一种表达方式
- import JSON
- with open ('json_te','r') as fn:
- con=JSON.load(fn)
- print(type(con)) #<class 'list'>
6.JSON 的 dumps 和 loads, 不能处理像函数 / 类, 这就需要用到 pickle
- import JSON
- def addmd(a,b):
- return int(a)+int(b)
- with open('pick_te','w') as fa:
- JSON.dump(fa,addmd)
- #TypeError: <_io.TextIOWrapper name='pick_te' mode='w' encoding='cp936'> is not JSON serializable
对比以下用 pickle 实现
- import pickle
- def addmd():
- return 1+1
- addmd=pickle.dumps(addmd)
- with open('pick_te','wb') as fa:
- fa.write(addmd
7. 还有一个 shelve 模块, 只有包含一个 open 函数, 返回像字典一样的对象, 直接实现文件中内容的修改添加, 比 JSON 方便但是其他语言不通用.
- import shelve
- md=shelve.open('dict_t')
- md['name']='xiaohong'
- print(md['name']) #xiaohong
来源: https://www.cnblogs.com/duguxiren/p/12310652.html