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

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广播接收器未检测到按键事件   java不为特定列更改创建修订   java采用了更实用的方法   java桌面窗格HTML呈现   java处理internet连接丢失   java在调整JFrame的大小时,如何防止JTable的列调整大小?   如何用Java中的“Scanner.hasNext”完成程序   具有模块名称的java停止IntelliJ项目工具窗口?   执行已编译的Rails-Warbler JAR文件时发生java加载错误   java Spring数据redis存储库不支持集合查询?   每个客户端的java队列请求   获取Java中的JSON嵌套数组元素   java GWT,Vaadin ConcurrentModificationException   firebase存储中的java在保存照片之前,我需要发送两次照片   JavaSpringEleaf如何在容器外使用变量