zoukankan      html  css  js  c++  java
  • 聊聊pickle,序列化对象的神器

    工作中经常需要对一些数据进行传输,在Python中,万物皆对象,也就是说,需要对一些对象在网络中进行传输,必须要转换成为可以传输的字节码。

    一般我都喜欢用一个中间缓存来保存一些数据对象,用的最多的是redis。对于常规的Python内置对象,用json数据解码成字节码,很是方便,调试中可以直接从缓存中进行查看。

    假如用了pickle,这些数据都是转换了以后都是一些人类无法理解的字节码。

    话说这次操作的是一个collection中的OrderedDict对象,我在将该类对象保存到缓存的时候,一般习惯用repr强制转换成字符结构,解码放入缓存,后续通过eval提取出数据对象。

    a
    Out[25]: OrderedDict([('a', 1)])
    repr(a)
    Out[26]: "OrderedDict([('a', 1)])"
    

      

    就想上面显示的,当我在另外一个进程通过eval执行该字符串时,其实就是执行OrderedDict([('a', 1)])的表达式,这个时候OrderedDict是一个可调用对象,接入该进程中没有导入该对象,就会报错。

    但经过我的测试,pickle就显的很强大,当你传输一个对象无论是Python内置的,还是三方导入的,当你传入一个pickle数据给另外一个数据时,他在还原实例的时候,随便帮你导入,需要的可调用对象。

    简单的比方好了

    import requests
    a = requests.Session()
    

      

    这个requests是一个三方的包,a是一个实例对象,需要Session的可调用对象创建,当pickle.dumps完成以后,就变成了一串字节码。

    当另外一个进程通过pickle.loads还原该对象的时候,你不需要手动前置导入import requests,在还原对象的过程中会自动帮你导入。

    这个对于传输一些标准的Python内置对象与三方实例还是非常好用的。但自定义的实例肯定是不可以的。

    总结来说,序列化传输还是根据实际的情况来使用最好,标准的数据用json最好,特殊一些的用repr与eval搭配也可行,如果不需要中间缓存看数据内容,pickle肯定是最佳方案。

    最后再强调一次,任何对象序列化与反序列化之后,对象的内容是相等的,但对象已经不是原来的他,因为一个是另一个的拷贝,是在计算机两块不同的内存中,无论是否经过通信传输。

  • 相关阅读:
    [转]SP 2010: How To – Event Receivers and Custom Error Pages
    sharepoint ServerTemplate values
    SPSiteDataQuery不完全使用手册(转)
    jQuery EasyUI 提示框(Messager)用法
    单选按钮 点击value值自动把单选按钮选中
    easy ui tabs 顶部绑定事件
    jquery 中的 $("#id") 与 document.getElementById("id") 的区别
    jquery ajax 的data 存表单的值
    JSP中用include标签动态引入其它文件报错
    Js获取当前日期时间及其它操作
  • 原文地址:https://www.cnblogs.com/sidianok/p/15729569.html
Copyright © 2011-2022 走看看