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()
    
    
    
    
    
  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/achai222/p/12610110.html
Copyright © 2011-2022 走看看