zoukankan      html  css  js  c++  java
  • 序列化模块

    序列化模块

    1 序列化&反序列化的定义

    内存中的数据类型---->序列化---->特定的格式(json格式或者pickle格式)
    内存中的数据类型<----反序列化<----特定的格式(json格式或者pickle格式)

    土办法:
    {'aaa':111}--->序列化str({'aaa':111})----->"{'aaa':111}"
    {'aaa':111}<---反序列化eval("{'aaa':111}")<-----"{'aaa':111}"

    2、序列化的作用

    序列化得到结果=>特定的格式的内容有两种用途

    1 可用于存储=>用于存档

    2 传输给其他平台使用=>跨平台数据交互

    ​ python java
    ​ 列表 特定的格式 数组

    强调:
    针对用途1的特定一格式:是一种专用的格式=>pickle只有python可以识别
    针对用途2的特定一格式:是一种通用、能够被所有语言识别的格式=>json

    3 序列化与反序列化的方法

    3.1 json方法

    # 示范1
    import json
    # 序列化
    json_res=json.dumps([1,'aaa',True,False])
    print(json_res,type(json_res)) # "[1, "aaa", true, false]"
    
    # 反序列化
    l=json.loads(json_res)
    print(l,type(l))
    
    
    # 示范2:
    import json
    
    # 序列化的结果写入文件的复杂方法
    json_res=json.dumps([1,'aaa',True,False])
    # print(json_res,type(json_res)) # "[1, "aaa", true, false]"
    with open('test.json',mode='wt',encoding='utf-8') as f:
        f.write(json_res)
    
    # 将序列化的结果写入文件的简单方法
    with open('test.json',mode='wt',encoding='utf-8') as f:
        json.dump([1,'aaa',True,False],f)
    
    
    # 从文件读取json格式的字符串进行反序列化操作的复杂方法
    with open('test.json',mode='rt',encoding='utf-8') as f:
        json_res=f.read()
        l=json.loads(json_res)
        print(l,type(l))
    
    # 从文件读取json格式的字符串进行反序列化操作的简单方法
    with open('test.json',mode='rt',encoding='utf-8') as f:
        l=json.load(f)
        print(l,type(l))
    
    #json验证: json格式兼容的是所有语言通用的数据类型,不能识别某一语言的所独有的类型
    json.dumps({1,2,3,4,5})
    # TypeError: Object of type set is not JSON serializable
    
    # json强调:一定要搞清楚json格式,不要与python混淆
    l=json.loads('[1, "aaa", true, false]')
    l=json.loads("[1,1.3,true,'aaa', true, false]")
    print(l[0])
    

    json中字符串和字典中的字符串为双引号,布尔值为全小写,元组转化成列表

    l = json.loads(b'[1, "aaa", true, false]')
    print(l, type(l))
    
    with open('test.json',mode='rb') as f:
        l=json.load(f)
    
    
    res=json.dumps({'name':'哈哈哈'})
    print(res,type(res))
    
    res=json.loads('{"name": "u54c8u54c8u54c8"}')
    print(res,type(res))
    

    3.2 pickle方法

    pickle的方法用法和json相同

    不同在于pickle可以转换python中的任意数据类型

    # 5.pickle模块
    import pickle
    res=pickle.dumps({1,2,3,4,5})
    print(res,type(res))
    
    s=pickle.loads(res)
    print(s,type(s))
    

    4 猴子补丁

    注意: 一定要在入口处打猴子补丁

    猴子补丁是利用 模块在重复加载时不会重新创建名称空间,而是引用第一次导入的模块 的特点实现的

    猴子补丁可以将模块的某些功能换成另一个功能,并且完全不影响其他代码之前对原功能引用

    在入口处(一般为start文件)将模块的某一部分通过赋值覆盖掉,这样就能完成猴子补丁

    当效果不满意时仅需将入口处猴子补丁删除即可恢复原样

    import json
    import ujson
    
    def monkey_patch_json():
        json.__name__ = 'ujson'
        json.dumps = ujson.dumps
        json.loads = ujson.loads
    
    monkey_patch_json() # 在入口文件出运行
    
    
    # import ujson as json 的方法不能实现猴子补丁的效果
    # 因为其他文件依旧为import json,还是会创建json名称空间,需要把每个文件的import json都更改
    
    # 后续代码中的应用
    json.dumps()
    json.dumps()
    json.dumps()
    json.dumps()
    json.dumps()
    json.dumps()
    json.dumps()
    json.dumps()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    json.loads()
    
    
    
    
    
  • 相关阅读:
    〖教程〗Ladon提权MS16-135参数版(WIN7-2016)
    〖教程〗RDP会话劫持 Ladon无密码登陆管理员桌面会话
    Ladon for PowerShell远程加载教程
    〖教程〗NbtScan 139端口弱口令/Netbios密码爆破
    给你一个免费加入"小密圈"的机会
    活动目录(Active Directory,AD)的主要功能
    如何通过审计安全事件日志检测密码喷洒(Password Spraying)攻击
    mouseenter 和mouseover的区别
    如何获取可视区域宽高,获取元素到在文档中的位置
    闭包
  • 原文地址:https://www.cnblogs.com/achai222/p/12610110.html
Copyright © 2011-2022 走看看