了解Python常见的序列化操作

marshal
marshal使用的是与Python语言相关但与机器无关的二进制来读写Python对象的。这种二进制的格式也跟Python语言的版本相关,marshal序列化的格式对不同的版本的Python是不兼容的。
marshal一般用于Python内部对象的序列化。
一般地包括:
基本类型 booleans, integers,floating point numbers,complex numbers
序列集合类型 strings, bytes, bytearray, tuple, list, set, frozenset, dictionary
code对象 code object
其它类型 None, Ellipsis, StopIteration
marshal的主要作用是对Python“编译”的.pyc文件读写的支持。这也是marshal对Python版本不兼容的原因。开发者如果要使用序列化/反序列化,那么应该使用pickle模块。

pickle
pickle模块也能够以二进制的方式对Python对象进行读写。相比marshal提供基本的序列化能力,pickle的序列化应用更加广泛。
pickle序列化后的数据也是与Python语言相关的,即其它语言例如Java无法读取由Python通过pickle序列化的二进制数据。如果要使用与语言无法的序列化那么我们应该使用json。
能被pickle序列化的数据类型有:
None, True, and False
integers, floating point numbers, complex numbers
strings, bytes, bytearrays
tuples, lists, sets, and dictionaries 以及包含可以被pickle序列化对象
在模块顶层定义的函数对象 (使用 def定义的, 而不是 lambda表达式)
在模块顶层定义内置函数
在模式顶层定义的类
一个类的__dict__包含了可序列化的对象或__getstate__()方法返回了能够被序列化的对象
如果pickle一个不支持序列化的对象时将会抛出PicklingError。

json
json是与语言无关,非常通用的数据交互格式。在Python它与marshal和pickle一样拥有相似的API。
对于基本类型、序列、以及包含基本类型的集合类型json都可以很好的完成序列化工作。

总结一下
Python常见的序列化工具有marshal、pickle和json。marshal主要用于Python的.pyc文件,并与Python版本相关。它不能序列化用户定义的类。
pickle是Python对象的序列化工具则比marshal更通用些,它可以兼容Python的不同版本。json是一种语言无关的数据结构,广泛用于各种网络应用尤其在REST API的服务中的数据交互。

展开阅读全文

没有更多推荐了,返回首页