允许简单类型和复合类型轻松序列化的类集

PySerialization的Python项目详细描述


pyserialization

允许简单类型和复合类型轻松序列化的类集。

Python ^ {CD1>}模块可以灵活地序列化和反序列化大多数Python数据类型。然而,由于它的灵活性,在没有{^ pickle对可以序列化的内容有限制,使用pyserialization模块创建的任何内容都需要序列化。

此模块包括显式定义其序列化/反序列化过程的类。由于类型信息存储在类本身中,因此它们存储得尽可能紧凑,而不需要额外的元数据。为提供基本类型和基类提供了具体的类,以便轻松创建与现有类型一起创建的新序列化类型。所有类型都继承自Serializable

提供的具体类型为:

  • SerialInt系列
  • SerialHalf/SerialFloat/SerialDouble
  • SerialChar
  • SerialString/SerialAsciiString

提供的基本类型是:

  • SerialList
  • SerialEnum
  • Composite
  • Union

可选地,以下混凝土类型提供了附加模块

  • SerialNdArraynumpy
  • SerialImagePIL

序列化通过方法data = serializable.to_bytes()执行。这将返回一个pythonbytes对象,该对象稍后可以反序列化。通过obj, index = SerializableType.from_bytes(data)反序列化对象。这将返回反序列化对象以及数据结尾的索引。另外,现有的可序列化可以用^ {CD23>}重置。这只是返回数据末尾的索引。

大多数类型是可变的,可以使用SerialType.set()方法设置,并且可以使用SerialType.get()方法访问底层数据。

具体类型使用pythonstruct模块进行紧凑序列化。可选类型使用各自的模块进行序列化。基类型用于使用现有的可序列化类型创建新的具体类型。它们的工作原理如下:

串行列表

一个可以序列化的同质python列表。正在通过调用serial_list(SerialType)创建新的seriallist类型。例如:

class IntList(serial_list(SerialU16)):
    pass

这将创建一个可以保存u16整数的新列表类型

序列号

用于存储python enum.enum类的选定枚举。示例:

class Color(enum.Enum):
    RED = 'red'
    BLUE = 'blue'
    GREEN = 'green'

class SerialColor(serial_enum(Color0):
    pass

color1 = SerialColor(Color.BLUE)
color2 = SerialColor.from_bytes(color1.to_bytes())[0]

# color2.get() == 'Color.BLUE'
# Color2.get().value == 'blue'

复合

可能是最常用的基类型。用于创建一个新的可序列化类型,该类型是多个其他现有类型的组合。所有类型都将作为一个单元进行序列化和反序列化。如果存在,则对复合子类型的赋值将调用该类型^ {< CD28 > }方法。如果子类型有get方法,则检索该类型将返回type.get()。复合类型被指定为类属性。示例:

class Test(Composite):
    a = SerialU16
    b = SerialString
    c = SerialDouble

composite1 = Test()
composite1.a = 42             # Calls SerialU16.set(42)
composite1.b = 'hello world'
composite1.c = 3.4

composite2 = Test.from_bytes(composite1.to_bytes())[0]

# composite2.a == 42          # Calls SerialU16.get()
# composite2.b == 'hello world'
# composite2.c == 3.4

联合体

将为任何人保存多个可序列化类型之一。一次只能有一个类型的值,并且知道要恢复什么类型。可以使用Union.set更改类型。如果子类型具有set方法,则可以使用属性设置。如果子类型具有get方法,则使用属性get将返回subtype.get()。示例

class Test(Union):
    a = SerialU16
    b = SerialString
    c = SerialDouble

union1 = Test()
union1.a = 42             # union1.get() == SerialU16(42)
union1.b = 'hello world'  # union1.get() == SerialString('hello world')
# print(union1.a) -> ValueError

union2 = Test.from_bytes(union1.to_bytes())[0]

# composite2.b == 'hello world'   # Calls SerialU16.get()
# composite2.get() == 'SerialSting('hello world')

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Jsonify使用Jackson来定义嵌套对象   在Swing中禁用java图形调试   java Selenium Webdriver拖放在Jenkins上不起作用   java我对一个显示器的问题有一个非常不切实际的询问   java增强的“for”循环导致ArrayIndexOutOfBoundsException   ArrayAdapter适用于Java中的安卓编程,字符串数组   linux在Ubuntu上通过PulseAudio播放Java音频文件时出错   java在Spring应用程序中加载内部(类路径)和外部属性文件   java使用Maven连接到mySQL   Java应用程序的设计   websocket在电报api java中与dc的连接   java XMLStreamException,因为xml中的(&N)   java从控制台输出到JTextArea   Java导出文本文件   java实现parseInt方法   java为什么servlet容器会同步对特定资源/servlet的多个请求的访问?   循环中的Java“while”变量   用Java编程一个国际象棋游戏,gameOver布尔不起作用   java如何获得真正的JPanel大小?