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

    什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化
    反序列化就是把字符串变为其他数据类型
    假如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
    现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。
    但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。
    你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?
    没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串,
    但是你要怎么把一个字符串转换成字典呢?
    聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。
    eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
    BUT!强大的函数有代价。安全性是其最大的缺点。
    想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。
    而使用eval就要担这个风险。
    所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

    序列化的目的

    1、以某种存储形式使自定义对象持久化。
    2、将对象从一个地方传递到另一个地方。
    3、使程序更具维护性。


    json*****写程序给别人用需要用到
    通用的序列化格式,相当于语言界的英语,所有语言都通用
    缺点:只有很少的一部分数据类型能够通过json转换为字符串
    优点:通用
    json格式'{"k1":"a"}' 序列化之后,内部都是双引号,外部单引号
    可以序列化的:数字,字符串,列表,字典,元祖
    dumps序列化方法 此方法使用之后即可在内存当中直接调用
    loads反序列化方法
        dic = {1:"a",2:'b'}
    print(type(dic),dic)
    import json
    str_d = json.dumps(dic) # 序列化
    print(type(str_d),str_d)
    # '{"kkk":"v"}'
    dic_d = json.loads(str_d) # 反序列化
    print(type(dic_d),dic_d)


    dump方法只能操作文件,意味着必须要打开一个文件进行操作,在dump里加参数ensure_ascii可以改变编码方式
    load从文件里取出来的内容取决于怎么写进去的

    pickle****
    优点:所有pythoon中的数据类型都可以转换成字符串
    缺点:pickle序列化的内容只有python能理解
    且部分反序列化依赖代码

    shelve***
    有一个句柄
    使用句柄直接操作,非常方便
    新的序列化方式
  • 相关阅读:
    svn 提交失败 更新失败 提示 已经锁定
    Jquery 弹出提示框输入插件 apprise 修改中文按钮以及使用说明
    英文 数字 不换行 撑破div容器
    .clear 万能清除浮动
    Repeater 控件 当数据源没有数据的时候显示 暂无数据 的两种方式
    已以用户 NT AUTHORITYSYSTEM 的身份执行。 对象 名称 'XXX' 包含的前缀超出了最大限值。最多只能有 2 个。
    EasyUI的onLoadSuccess方法
    安装完office后 在组件服务里DCOM配置中找不到
    怎么看SQL表里某列是否是自增列
    SQL连接服务器链接失败
  • 原文地址:https://www.cnblogs.com/ddjl/p/8268844.html
Copyright © 2011-2022 走看看