序列化和反序列化

api接口开发,最核心最常见的一个过程就说序列化,所谓序列化就说把数据转换格式。

序列化:

  把我们语言识别的数据转化成指定的格式提供给别人

反序列化:

  把别人提供的数据转换/还原成我们需要的格式

Django中的序列化和反序列化

  序列化过程:

    我们再Django中获取到的数据默认是模型对象(qs对象),但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。

  反序列化过程:

    前端传入到后端的数据是json格式的字符串给到了后端,后端存到数据库中,需要转成python中的对象,把json格式字符串转成python对象存到数据库的过程称为反序列化

相关模块

模块名称描述提供的api
json 用于实现Python数据类型与通用(json)字符串之间的转换 dumps()、dump()、loads()、load()
pickle 用于实现Python数据类型与Python特定二进制格式之间的转换 dumps()、dump()、loads()、load()
shelve 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 open()

json模块

  1、Python的JSON模块 序列化与反序列化的过程分别叫做:encoding 和 decoding。

    encoding: 把Python对象转换成JSON字符串

    decoding: 把JSON字符串转换成python对象

  json模块的序列化和反序列化操作

# 序列化:将Python对象转换成json字符串
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

# 反序列化:将json字符串转换成Python对象
loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

  序列化后得到的json数据保存到文件中,以及直接读取文件中的json数据进行反序列化操作:

# 序列化:将Python对象转换成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字符串并转换成Python对象
load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

  2、JSON与Python之间数据类型对应关系

  Python转JSON

PythonJSON
dict Object
list, tuple array
str string
int, float, int- & float-derived Enums numbers
True true
False false
None null

  JSON转python

JSONPython
object dict
array list
string str
number(int) int
number(real) float
true True
false False
null None

pickle模块

  pickle模块实现了用于对Python对象结构进行 序列化 和 反序列化 的二进制协议,pickle模块序列化和反序列化的过程分别叫做 pickling 和 unpickling:

    pickling: 是将Python对象转换为字节流的过程;

    unpickling: 是将字节流二进制文件或字节对象转换回Python对象的过程;

  1、pickle模块与json模块对比

    JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),而pickle是一个二进制序列化格式;

    JOSN是我们可以读懂的数据格式,而pickle是二进制格式,我们无法读懂;

    JSON是与特定的编程语言或系统无关的,且它在Python生态系统之外被广泛使用,而pickle使用的数据格式是特定于Python的;

    默认情况下,JSON只能表示Python内建数据类型,对于自定义数据类型需要一些额外的工作来完成;pickle可以直接表示大量的Python数据类型,包括自定数据类型(其中,许多是通过巧妙地使用Python内省功能自动实现的;复杂的情况可以通过实现specific object API来解决)

  2、pickle模块使用的数据流格式

    pickle使用的数据格式是特定于Python的。这使得它不受诸如JSON或XDR的外部标准限值,但是这也意味着非Python程序可能无法重建pickled Python对象。默认情况下,pickle数据格式使用相对紧凑的二进制表示。如果需要最佳大小特征,可以有效的压缩pickled数据。pickletools模块包含可以用于对pickle生成的数据流进行分析的工具。目前有5种不同的协议可以用于pickle。使用的协议越高,就需要更新的Python版本去读取pickle产生的数据:

    协议v0是原始的“人类可读”协议,并且向后兼容早期的Python版本;

    协议v1是一个旧的二进制格式,也与早期版本的Python兼容;

    协议v2在Python 2.3中引入,它提供更高效的pickling;

    协议v3是在Python 3.0添加的协议,它明确支持bytes对象,且不能被Python 2.x 进行unpickle操作;这是默认协议,也是当需要兼容其他Python 3版本时被推荐使用的协议;

    协议4是在Python 3.4添加的协议,它添加了对极大对象的支持,pickling更多种类的对象,以及一些数据格式的优化。

  3、pickle模块提供的相关函数

    pickle模块提供的几个序列化/反序列化的函数与json模块基本一致:

# 将指定的Python对象通过pickle序列化作为bytes对象返回,而不是将其写入文件
dumps(obj, protocol=None, *, fix_imports=True)

# 将通过pickle序列化后得到的字节对象进行反序列化,转换为Python对象并返回
loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")

# 将指定的Python对象通过pickle序列化后写入打开的文件对象中,等价于`Pickler(file, protocol).dump(obj)`
dump(obj, file, protocol=None, *, fix_imports=True)

# 从打开的文件对象中读取pickled对象表现形式并返回通过pickle反序列化后得到的Python对象
load(file, *, fix_imports=True, encoding="ASCII", errors="strict")

  说明: 上面这几个方法参数中,*号后面的参数都是Python 3.x新增的,目的是为了兼容Python 2.x,具体用法请参看官方文档。

shelve模块

  shelve是一个简单的数据存储方案,类似key-value数据库,可以很方便的保存python对象,其内部是通过pickle协议来实现数据序列化。shelve只有一个open()函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个shelf对象。shelf是一种持久的、类似字典的对象。它与“dbm”的不同之处在于,其values值可以是任意基本Python对象--pickle模块可以处理的任何数据。这包括大多数类实例、递归数据类型和包含很多共享子对象的对象。keys还是普通的字符串。

open(filename, flag='c', protocol=None, writeback=False)

  flag 参数表示打开数据存储文件的格式,可取值与dbm.open()函数一致:

描述
'r' 以只读模式打开一个已经存在的数据存储文件
'w' 以读写模式打开一个已经存在的数据存储文件
'c' 以读写模式打开一个数据存储文件,如果不存在则创建
'n' 总是创建一个新的、空数据存储文件,并以读写模式打开

  protocol 参数表示序列化数据所使用的协议版本,默认是pickle v3;

  writeback 参数表示是否开启回写功能。

附录

要实现的功能可以使用的api
将Python数据类型转换为(json)字符串 json.dumps()
将json字符串转换为Python数据类型 json.loads()
将Python数据类型以json形式保存到本地磁盘 json.dump()
将本地磁盘文件中的json数据转换为Python数据类型 json.load()
将Python数据类型转换为Python特定的二进制格式 pickle.dumps()
将Python特定的的二进制格式数据转换为Python数据类型 pickle.loads()
将Python数据类型以Python特定的二进制格式保存到本地磁盘 pickle.dump()
将本地磁盘文件中的Python特定的二进制格式数据转换为Python数据类型 pickle.load()
以类型dict的形式将Python数据类型保存到本地磁盘或读取本地磁盘数据并转换为数据类型 shelve.open()

详情:https://www.cnblogs.com/yyds/p/6563608.html

posted @ 2022-03-29 15:26  那就凑个整吧  阅读(202)  评论(0编辑  收藏  举报