序列化与反序列化:以Python举例 ---> json与pickle格式、ujson为例的猴子补丁思想

首先解决,什么是序列化与反序列化?

序列化指的是把内存的数据类型转换成一种特定的格式的内容

反序列化即为序列化过程的反解

序列化过程:内存中的数据-->序列化-->特定的格式(json格式或pickle格式)

序列化概念举例:

一种数据结构:     通过序列化方法str():     转换成了某种特定格式的内容:
字典{'aaa':111}-->序列化str({'aaa':111})-->字符串格式"{'aaa':111}"

反序列化概念举例:eval()方法

那序列化有什么应用呢?

对于序列化后得到的结果 --> ''特定格式内容''有两种用途:

1.用于存储(把内存中的一种数据类型保存到了硬盘上去)如存储程序某时的运行状态

2.传输给其他平台使用,如跨平台(语言)数据交互  python的列表-->java的数组

针对用途1的特定格式:pickle
是只有Python可以识别的

针对用途2的特定格式:json
是一种通用、能被所有语言识别的格式,但并不是所有语言的所有数据结构都有相应的json格式类型,比如python中的集合

json格式是一种经过老前辈们迭代过的产物,它基本代替了除了现在部分老旧金融业务发展至今的项目中仍在使用的通过<>节点来区别数据结构的xml格式(形式有点像html),同时也基本淘汰了shelve格式

原因主要在于json格式是否强大的可读性,这也是代码的特性中个人认为最为重要的一点

重点来了,如何进行序列化与反序列化咧?

以json为例:

序列化(dumps)

import json                        # 引入json模块进行与json相关的序列化操作
json_res = json.dumps([1, 'aaa', True, False])      # 将python中的列表转为json格式
print(json_res, type(json_res))

with open('text.json', mode='w', encoding='utf-8') as f:        
    f.write(json_res)                            # # 将json格式内容写入json文档
然而,还有更简单将序列化结果写入文件的方法:
import json
with open('try.json', 'w', encoding='utf=8') as f:
    json.dump([1, 'aaa', True, False], f)             
    # dump方法第一个参数为要写入并转换为json格式的内容,第二个参数为要写入的文件

反序列化(loads)

import json
with open('text.json', mode='r', encoding='utf-8') as f:
    json_res = f.read()
    res = json.loads(json_res)      # 反序列化

print(res, type(res))
同样也有从文件读取序列化结果并直接进行反解的简单方法:
import json
with open('text.json', 'r', encoding='utf-8') as f:
    res = json.load(f)                  # json.load方法直接将目标文件的json格式读出并反解为原内容

PS:以上方法也适用于pickle格式,就不在这里赘述,所以大家需要记住的就是:
序列化–>dump
反序列化–>json

且json的跨平台性是很好的,应用也更为广泛

强调:json当中的字符串使用的是双引号引用,切不要因为结构较为相似而将json格式与语言的数据结构混淆,比如json格式与python中的字典很相似

猴子补丁编程思想

分享到这,很多注重效率的开发者可能会想,
‘‘都python3.8了,怎么还有人用json模块?’’

原因是言简意赅的:
python第三方库中,有大神写出了比json模块中方法运行效率更高,且使用方法一模一样的模块:ujson

使用方法真的一模一样,ujson模块就不展开介绍了,就像你亲爱的对象为了给你一个惊喜,暗自把你爱车的发动机升级了,你第二天上班还是原来怎么开就怎么开,但你会发现:启动起来怎么变快了!

但这也抛出了一个问题:
‘‘我之前的项目里用的是json模块,现在才知道有了ujson,想替换该怎么办?在线等,急’’
这里除了把ujson模块import进来,把程序中你所能看到的有引用json模块的地方都换成ujson这种狠人方法外(万一你用了几百遍呢!),我们可以应用一种编程思想,称为猴子补丁,在这种应用场景会或许会很有帮助

实现思路

猴子补丁(编程思想)
核心思想就是用自己的代码去替代所用模块的源代码,可以增强模块的功能与个性化

打补丁的推荐位置:
多次导入模块时,只会在初次导入模块时被执行(申请内存空间、代码运行等),
后续再执行到导入模块时只会调用第一次导入的执行结果,故补丁应在第一次导入时打

推荐在程序入口文件打补丁,在不想使用补丁功能时也易于移除(直接注释)

实现代码(以ujson模块替代json模块为例)

import json
import ujson

def monkey_patch_json():
    json.__name__ = 'ujson'           # 直接粗暴换名字!
    json.dumps = ujson.dumps          # 把这个原模块中用到的方法都类似这样命名一下
    json.loads = ujson.loads

monkey_patch_json()         
# 建议在程序入口处运行,后续程序中只要调用json的dumps和loads两个方法都相当于是调了ujson的

所以今后当你开发出了对于某一系列功能较原模块更强大时,可以考虑应用这种思想,可以提高你的开发效率!

对于猴子补丁的思考

不知道有没有同学到这里可能会像我一样想:
‘‘我直接import ujson as json,不是改的更快?(doge)’’
这里我们一定要去除对于这个’‘as’‘中理解的误区,它是’‘当作’'的意思,主要目的是让你在使用模块的时候能够更顺手,更便于记忆,但无论你把原模块as了什么,名称空间是没有改变的哦!内存中的所有方法都还是原函数的!

文章中若有不正之处,恳请各位不吝批判指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值