10-2 数据序列化和反序列化Python程序设计基础教程(微课版第2版)_第1页
10-2 数据序列化和反序列化Python程序设计基础教程(微课版第2版)_第2页
10-2 数据序列化和反序列化Python程序设计基础教程(微课版第2版)_第3页
10-2 数据序列化和反序列化Python程序设计基础教程(微课版第2版)_第4页
10-2 数据序列化和反序列化Python程序设计基础教程(微课版第2版)_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

将内存里的数据变成一个容易写入文件的形式序列化和反序列化CHAPTER10CONTENTS目

录01使用JSON对数据进行序列化和反序列化02使用pickle对数据进行序列化和反序列化03两种序列化方式的对比数据序列化和反序列化在现行软件体系中写入文件的形式写入文件字符流字节流将数据内容以字节的形式保存到文件中,在读取过程中需要先读取字节,再将字节按照一定的规则转换为可以识别的内容将数据内容使用字符的形式保存到文件中,在读取过程,读取到的所有内容都是字符数据序列化和反序列化字符流一种非常常见的文件保存形式,比如py文件、记事本文件等,直接打开这些文件可以看到里面所有的内容都是一个个字符数据序列化和反序列化常用的字符流文件01INI02HTML03XML04JSON数据序列化和反序列化在现行软件体系中写入文件的形式写入文件字符流字节流将数据内容以字节的形式保存到文件中,在读取过程中需要先读取字节,再将字节按照一定的规则转换为可以识别的内容将数据内容使用字符的形式保存到文件中,在读取过程,读取到的所有内容都是字符数据序列化和反序列化字节流二进制数据在计算机系统中,越是底层,字节流方法就越常用数据序列化和反序列化网络数据的发送和接收数据按照指定格式序列化字节流数据序列化和反序列化使用JSON对数据进行序列化和反序列化>>>importjson>>>dict={'name':'Tom','age':23}>>>data=json.dumps(dict,indent=4)>>>print(data){"name":"Tom","age":23}>>>data=json.dumps(dict)>>>print(data){"name":"Tom","age":23}在Python中使用JSON序列化后的数据数据序列化和反序列化使用JSON时引用“json”模块JSON序列化之后的结果

同Python里的字典几乎完全一样数据序列化和反序列化高级编程软件里,大多数的字典的数据模型都是按照与JSON类似的格式进行设计数据序列化和反序列化Python字典与JSON的区别键JSON的键必须是一个由双引号包裹的字符串,是有序的可重复Python字典的键可以是任何可以哈希的对象、不可重复数据序列化和反序列化Python里值可是元素或者列表,可以是任意编码的任意字符JSON里值只能是数组或者另一个列表,如果使用Unicode编码,就必须使用“\uxxxx”的形式书写字符值数据序列化和反序列化【例】“\uxxxx”形式书写字符>>>dict={'name':'中文字符','age':23}>>>print(json.dumps(dict)){"name":"\u4e2d\u6587\u5b57\u7b26","age":23}数据序列化和反序列化真、假和空值PythonJSONTrue、False和Nonetrue、false和null注意大小写数据序列化和反序列化>>>dict={'name':'某人','boy':True,'girl':False,'title':None}>>>print(json.dumps(dict)) {"name":"\u67d0\u4eba","boy":true,"girl":false,"title":null}【例】

在JSON中使用

true、false和null来表示真、假和空值的代码如下数据序列化和反序列化dumps函数的原型

在序列化时dumps函数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)数据序列化和反序列化在使用

dumps函数过程中需要注意的参数obj需要序列化的对象skipkeys默认为假sort_keys默认为假

indent默认为None数据序列化和反序列化skipkeysstrintfloatboolNone否则字典键会引发异常如果设为真,不是基本对象的字典键会被跳过数据序列化和反序列化在使用

dumps函数过程中需要注意的参数obj需要序列化的对象skipkeys默认为假sort_keys默认为假

indent默认为None数据序列化和反序列化indent值非负整数或字符串指定数目的空格指定字符串JSON字符串美化输出内容数据序列化和反序列化默认使用None生成输出美观字符串持久化紧凑字符串JSON字符串数据序列化和反序列化在使用

dumps函数过程中需要注意的参数obj需要序列化的对象skipkeys默认为假sort_keys默认为假

indent默认为None数据序列化和反序列化如果设置为真输出的JSON字符串的键将会被排序按照默认设置此函数输出的是一个字符串“JSON字符串”或“JSON”

这个用来保存到持久化场所的字符串数据序列化和反序列化>>>string='{"name":"\u67d0\u4eba","boy":true,"girl":false,"title":null}'>>>print(json.loads(string)){'name':'某人','boy':True,'girl':False,'title':None}【例】

在JSON中使用

true、false和null来表示真、假和空值的代码如下结果是原来的对象数据序列化和反序列化使用pickle对数据进行序列化和反序列化在Python里,自定义编码的字节流需要程序员在使用时自行编码实现。Python本身也为程序员们提供了一个基本的模块“pickle”来帮助实现对数据的序列化和反序列化数据序列化和反序列化【例】模块“pickle”实现对数据的序列化和反序列化,具体实例如下>>>importpickle>>>vCard={'firstName':'名','lastName':'姓','title':'职位','mobilePhoneNumber':,'organization':'公司名','weChatNumber':'微信号'}>>>bytes=pickle.dumps(vCard)>>>print(bytes)b'\x80\x04\x95\x91\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\tfirstName\x94\x8c\x03\xe5\x90\x8d\x94\x8c\x08lastName\x94\x8c\x03\xe5\xa7\x93\x94\x8c\x05title\x94\x8c\x06\xe8\x81\x8c\xe4\xbd\x8d\x94\x8c\x11mobilePhoneNumber\x94\x8c\x0x94\x8c\x0corganization\x94\x8c\t\xe5\x85\xac\xe5\x8f\xb8\xe5\x90\x8d\x94\x8c\x0cweChatNumber\x94\x8c\t\xe5\xbe\xae\xe4\xbf\xa1\xe5\x8f\xb7\x94u.'结果是无法读取的字节串数据序列化和反序列化二进制代码构建了特殊的字符串可执行文件数据序列化和反序列化使用pickle时不信任数据的来源不使用这个函数序列化和反序列化数据反序列化之前验证这个签名是否正确序列化之后用MD5或SHA-1对数据签名在反序列化过程中,恶意攻击可通过反序列化过程直接执行恶意代码数据序列化和反序列化数据序列化和反序列化

【例】使用pickle进行反序列化,具体实例如下>>>bytes=b'\x80\x04\x95\x91\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\tfirstName\x94\x8c\x03\xe5\x90\x8d\x94\x8c\x08lastName\x94\x8c\x03\xe5\xa7\x93\x94\x8c\x05title\x94\x8c\x06\xe8\x81\x8c\xe4\xbd\x8d\x94\x8c\x11mobilePhoneNumber\x94\x8c\x0x94\x8c\x0corganization\x94\x8c\t\xe5\x85\xac\xe5\x8f\xb8\xe5\x90\x8d\x94\x8c\x0cweChatNumber\x94\x8c\t\xe5\xbe\xae\xe4\xbf\xa1\xe5\x8f\xb7\x94u.'>>>obj=pickle.loads(bytes)>>>print(obj){'firstName':'名','lastName':'姓','title':'职位','mobilePhoneNumber':,'organization':'公司名','weChatNumber':'微信号'}数据序列化和反序列化两种序列化方式的对比01文件相对于pickle较大文件字符串02文件相对于JSON较小字节流JSONpickle数据序列化和反序列化

【例】保存同样的Unicode字符具体文件大小实例如下>>>importjson>>>importpickle>>>obj={'firstName':'名','lastName':'姓','title':'职位','mobilePhoneNumber':,'organization':'公司名','weChatNumber':'微信号'}>>>js=json.dumps(obj)>>>len(js)182>>>pi=pickle.dumps(obj)>>>len(pi)156数据序列化和反序列化两种序列化方式的对比输出结果JSONpickle不易读易读易读:人类的可读性数据序列化和反序列化

【例】

输出结果上的易读性二者对比实例>>>obj={'firstName':'名','lastName':'姓','title':'职位','mobilePhoneNumber':,'organization':'公司名','weChatNumber':'微信号'}>>>js=json.dumps(obj)>>>pi=pickle.dumps(obj)>>>print(js){"firstName":"\u540d","lastName":"\u59d3","title":"\u804c\u4f4d","mobilePhoneNumber":,"organization":"\u516c\u53f8\u540d","weChatNumber":"\u5fae\u4fe1\u53f7"}>>>print(pi)b'\x80\x04\x95\x91\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\tfirstName\x94\x8c\x03\xe5\x90\x8d\x94\x8c\x08lastName\x94\x8c\x03\xe5\xa7\x93\x94\x8c\x05title\x94\x8c\x06\xe8\x81\x8c\xe4\xbd\x8d\x94\x8c\x11mobilePhoneNumber\x94\x8c\x0x94\x8c\x0corganization\x94\x8c\t\xe5\x85\xac\xe5\x8f\xb8\xe5\x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论