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

 更新时间:2015年07月01日 12:12:22   作者:DarkBull  
这篇文章主要介绍了在Python中marshal对象序列化的相关知识,是Python进阶学习中序列化相关的知识,需要的朋友可以参考下

有时候,要把内存中的一个对象持久化保存到磁盘上,或者序列化成二进制流通过网络发送到远程主机上。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轻松实现PDF转图片

    基于Python轻松实现PDF转图片

    PDF文件是我们在日常工作和学习中常用的文档格式之一,但你知道吗,你可以将PDF文件转换为图像,让文档变得更加生动有趣,下面我们就来看看具体的实现方法吧
    2023-08-08
  • Python如何生成requirements.txt

    Python如何生成requirements.txt

    在 Python 项目中,requirements.txt 文件通常用于列出项目依赖的库及其版本号,本文主要介绍了Python生成requirements.txt的几个常用方法,希望对大家有所帮助
    2025-02-02
  • Python查看多台服务器进程的脚本分享

    Python查看多台服务器进程的脚本分享

    这篇文章主要介绍了Python查看多台服务器进程的脚本分享,需要的朋友可以参考下
    2014-06-06
  • 带你了解python装饰器

    带你了解python装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里。Python中的装饰器的概念经常会让人搞得一头雾水,所以今天就好好来分析一下python中的装饰器
    2017-06-06
  • 分分钟入门python语言

    分分钟入门python语言

    分分钟学会一门语言之Python篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 推荐值得学习的12款python-web开发框架

    推荐值得学习的12款python-web开发框架

    这篇文章主要介绍了值得学习的12款python-web开发框架,帮助大家更好的理解和学习Python web开发,感兴趣的朋友可以了解下
    2020-08-08
  • Python排序算法实例代码

    Python排序算法实例代码

    这篇文章主要为大家详细介绍了Python实现排序算法的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • python新式类和经典类的区别实例分析

    python新式类和经典类的区别实例分析

    这篇文章主要介绍了python新式类和经典类的区别,结合实例形式分析了python新式类和经典类的功能、区别与使用方法,需要的朋友可以参考下
    2020-03-03
  • Python3+OpenCV实现简单交通标志识别流程分析

    Python3+OpenCV实现简单交通标志识别流程分析

    这篇文章主要介绍了Python3+OpenCV实现简单交通标志识别,主要思路是解析XML文档,根据<name>标签进行分类,如果是直行、右转、左转、停止就把它从原图中裁剪下来并重命名,感谢的朋友跟随小编一起看看示例代码
    2021-12-12
  • Pandas DataFrame添加一行数据的几种方法

    Pandas DataFrame添加一行数据的几种方法

    在处理数据分析和数据科学项目时,经常会使用到Python中的pandas库来进行数据操作和分析,其中DataFrame是pandas库中最重要的数据结构之一,这篇文章主要给大家介绍了关于Pandas DataFrame添加一行数据的几种方法,需要的朋友可以参考下
    2024-08-08

最新评论