在Python中marshal对象序列化的相关知识


Posted in Python onJuly 01, 2015

有时候,要把内存中的一个对象持久化保存到磁盘上,或者序列化成二进制流通过网络发送到远程主机上。Python中有很多模块提供了序列化与反序列化的功能,如:marshal, pickle, cPickle等等。今天就讲讲marshal模块。

  • 注意: marshal并不是一个通用的模块,在某些时候它是一个不被推荐使用的模块,因为使用marshal序列化的二进制数据格式还没有文档化,在不同版本的Python中,marshal的实现可能不一样。也就是说,用python2.5序列为一个对象,用python2.6的程序反序列化所得到的对象,可能与原来的对象是不一样的。但这个模块存在的意义,正如Python手册中所说:The marshal module exists mainly to support reading and writing the “pseudo-compiled” code for Python modules of .pyc files.

下面是marshal模块中定义的一些与序列化/反序列化有关的函数:
marshal.dump(value, file[, version])

将值写入到一个打开的输出流里。参数value表示待序列化的值。file表示打开的输出流。如:以”wb”模式打开的文件,sys.stdout或者os.popen。对于一些不支持序列类的类型,dump方法将抛出ValueError异常。要特别说明一下,并不是所有类型的对象都可以使用marshal模块来序列化/反序列化的。在python2.6中,支持的类型包括:None, integers, long integers, floating point numbers, strings, Unicode objects, tuple, list, set, dict, 和 code objects。对于tuple, list, set, dict等集合对象,其中的元素必须也是上述类型之一。
marshal.load(file)

执行与marshal.dump相反的操作,将二进制数据反序列为Python对象。下面是一个例子,演示这两个方法的使用:
 

# coding=gbk
 
import  marshal ,  sys ,  os
 
lst  =  [ 1 ,  ( 2 ,  " string " ) ,  { " key " :  " Value " } ]
 
# 序列化到文件中
fle  =  open ( os . path . join ( os . getcwd ( ) ,  ' fle . txt ' ) ,  ' wb ' )
marshal . dump ( lst ,  fle )
fle . close ( )
 
# 反序列化
fle1  =  open ( os . path . join ( os . getcwd ( ) ,  ' fle . txt ' ) ,  ' rb ' )
lst1  =  marshal . load ( fle1 )
fle1 . close ( )
 
# 打印结果
print  lst
print  lst1
 
# ----  结果  ----
# [1,  (2,  'string'),  {'key':  'Value'}]
# [1,  (2,  'string'),  {'key':  'Value'}]
marshal.dumps(value[, version)

该方法与上面讲的marshal.dump()功能类似,只是它返回的是序列化之后的二进制流,而不是将这些数据直接写入到文件中。
marsahl.load(string)

将二进制流反序列化为对象。下面的一段代码,演示这两个方法的使用:
 

import  marshal ,  sys ,  os
 
lst  =  [ 1 ,  ( 2 ,  " string " ) ,  { " key " :  " Value " } ]
 
byt1  =  marshal . dumps ( lst )
lst1  =  marshal . loads ( byt1 )
 
# 打印结果
print  lst
print  lst1
 
# —-  结果  —-
# [1,  (2,  'string'),  {'key':  'Value'}]
# [1,  (2,  'string'),  {'key':  'Value'}]

更多关于marshal的内容,请参考Python手册。

Python 相关文章推荐
python实现从web抓取文档的方法
Sep 26 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
Python实现读取并保存文件的类
May 11 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
Python基于dom操作xml数据的方法示例
May 12 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
Django如何开发简单的查询接口详解
May 17 Python
Django models.py应用实现过程详解
Jul 29 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
python保存字符串到文件的方法
Jul 01 #Python
python选择排序算法实例总结
Jul 01 #Python
python实现的希尔排序算法实例
Jul 01 #Python
python获取一组汉字拼音首字母的方法
Jul 01 #Python
python的keyword模块用法实例分析
Jun 30 #Python
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 #Python
python实现爬取千万淘宝商品的方法
Jun 30 #Python
You might like
php function用法如何递归及return和echo区别
2014/03/07 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
Python中使用中文的方法
2011/02/19 Python
python数据结构之二叉树的建立实例
2014/04/29 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
python的命名规则知识点总结
2019/10/04 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
python 模块导入问题汇总
2021/02/01 Python
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
公司承诺书范文
2014/05/19 职场文书
出国签证在职证明
2014/09/20 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
2014小学年度工作总结
2014/12/20 职场文书
考研复习计划
2015/01/19 职场文书
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
redis中lua脚本使用教程
2021/11/01 Redis
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers