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

    什么是序列化?

    我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思

    为什么要序列化?

    1:持久保存状态

    需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,'状态'会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。

    内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。

    在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

    2:跨平台数据交互

    序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

    反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling

    JSON序列化

    import json
    # 将json类型的对象与json类型的字符串相互转换
    # {} 与 [] 嵌套形成的数据(python中建议数据的从{}开始)

    dic = {
    'a': 1,
    'b': [1, 2, 3, 4, 5]
    }
    # 序列化: 将python的字典转化为字符串传递给其他语言或保存
    json_str = json.dumps(dic)
    print(json_str)

    with open('1', 'w', encoding='utf-8') as w:
    json.dump(dic, w) # 先将dic对象转化为字符串,再写入文件
    # w.write(dic)

    # 反序列化(字符str形式操作)
    json_str = '''{"a": 1, "b": ['1', 2, 3, 4, 5]}'''
    json_str = "{'a': 1, 'b': [1, 2, 3, 4, 5]}"
    json_str = '''{"a": 1, "b": [1, 2, 3, 4, 5]}'''
    new_dic = json.loads(json_str) # json类型的字符串不认''
    print(new_dic, type(new_dic))

    with open('1', 'r', encoding='utf-8') as r:
    res = json.load(r)
    print(res)

    pickle序列化

    import pickle
    # 可以将任意类型对象与字符串进行转换
    dic = {
    'a': 1,
    'b': [1, 2, 3, 4, 5]
    }
    res = pickle.dumps(dic)
    print(res)

    with open('2', 'wb') as w:
    pickle.dump(dic, w)

    # 反序列化(字节bytes形式操作)

    print(pickle.loads(res))
    with open('2', 'rb') as r:
    print(pickle.load(r))

    两者区别以及优缺点

    json序列化成字符形式,pickle序列化成字节形式

    json 的优点和缺点

    优点  跨语言,体积小

    缺点 只能支持 int str list tuple dict,不支持对象类型的序列化

    pickle 的优点和缺点

    优点 专门为python设计,支持python所有的数据类型,包括对象object

    缺点 只能python使用,存储数据占空间大

  • 相关阅读:
    [做题记录-乱做] [AGC004F] Namori
    字符串分割去除空格
    逆向实战01-嘟嘟牛在线
    mysql超8小时解决
    macbook golang的debug模式不好使
    博客暂时废弃公告
    [干货] 博客园主题
    [Contest on 2021.10.14] 我靠,真的好困!
    [Contest on 2021.10.9] 说好的 100kb 呢?
    [Contest on 2021.10.7] 已经起不了标题了...
  • 原文地址:https://www.cnblogs.com/zhangdajin/p/11144416.html
Copyright © 2011-2022 走看看