📜  marshal - 内部Python对象序列化

📅  最后修改于: 2022-05-13 01:55:03.477000             🧑  作者: Mango

marshal - 内部Python对象序列化

序列化数据意味着将其转换为字节字符串,然后再从这样的字符串重构它。如果数据完全由基本的Python对象组成,序列化数据的最快方法是使用 marshal 模块(对于用户定义的类,应该首选 Pickle)。 Marshal 模块包含可以以二进制格式读取和写入Python值的函数。

marshal模块的存在主要是为了支持对 .pyc 文件的Python模块的“伪编译”代码的读写。此模块不支持所有Python对象类型。

支持以下类型:布尔值、整数、浮点数、复数、字符串、字节、字节数组、元组、列表、集合、冻结集、字典和代码对象,其中应理解元组、列表、集合、冻结集仅当其中包含的值本身得到支持时,才支持字典。单例 None、Ellipsis 和 StopIteration 也可以被编组和解组。

职能 :

  1. 元帅版本:
    它指示模块使用的格式。
    • 版本 0 – 历史格式
    • 版本 1 – 共享内部字符串
    • 版本 2 – 对浮点数使用二进制格式
    • 版本 3 – 支持对象实例化和递归
    • 版本 4 – 当前版本
  2. marshal.dumps(值 [,版本]):
    该函数返回将通过转储(值,文件)写入文件的字节对象。 version 参数指示转储应使用的数据格式。如果值具有(或包含具有)不受支持的类型的对象,则会引发 ValueError 异常。

    例子

    Python3
    # Python code to demonstrate serialization
    import marshal
      
    data = {12:'twelve', 'feep':list('ciao'), 1.23:4+5j, 
            (1,2,3):u'wer'}
    bytes = marshal.dumps(data)
      
    print (bytes)


    Python3
    # Python code to demonstrate de-serialization
    import marshal
      
    data = {12:'twelve', 'feep':list('ciao'), 1.23:4+5j, 
            (1,2,3):u'wer'}
    bytes = marshal.dumps(data)
    redata = marshal.loads(bytes)
      
    print (redata)


    输出

    {tfeep[tctitatog®Gáz®ó?y@@ittwelve(iiiuwer0}
    
  3. marshal.loads(字节):
    此函数可以通过将类似字节的对象转换为值来重建数据。如果未找到值,则会引发 EOFError、ValueError 或 TypeError。

    例子

    Python3

    # Python code to demonstrate de-serialization
    import marshal
      
    data = {12:'twelve', 'feep':list('ciao'), 1.23:4+5j, 
            (1,2,3):u'wer'}
    bytes = marshal.dumps(data)
    redata = marshal.loads(bytes)
      
    print (redata)
    


    输出
    {12: 'twelve', 1.23: (4+5j), 'feep': ['c', 'i', 'a', 'o'], (1, 2, 3): u'wer'}
    
  4. marshal.dump(值,文件 [,版本]):
    该函数用于在打开的可写二进制文件上写入支持的类型值。如果值的类型不受支持,则会引发 ValueError 异常。
  5. marshal.load(文件):
    此函数从打开的可读二进制文件中读取一个值并将其返回。如果未读取任何值,则会引发 EOFError、ValueError 或 TypeError。