将python数据类序列化/反序列化为各种其他数据格式
dataclasses-serialization的Python项目详细描述
数据类序列化
dataclasses_serialization
提供序列化器/反序列化器,用于在python数据类、json和bson对象之间进行转换。
基本用法
假设我们有以下数据类:
fromdataclassesimportdataclass@dataclassclassInventoryItem:name:strunit_price:floatquantity_on_hand:int
然后,我们可以使用JSONSerializer
>>> fromdataclasses_serialization.jsonimportJSONSerializer>>> JSONSerializer.serialize(InventoryItem("Apple",0.2,20)){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> JSONSerializer.deserialize(InventoryItem,{'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
蒙戈
由于mongo集合将对象存储为bson,因此可以使用BSONSerializer
将数据类直接转储到mongo中。
fromdataclasses_serialization.bsonimportBSONSerializercollection.insert_one(BSONSerializer.serialize(item))item=BSONSerializer.deserialize(InventoryItem,collection.find_one())
自定义序列化程序
要创建自定义序列化程序,请创建dataclasses_serialization.serializer_base.Serializer
:
fromdataclasses_serialization.serializer_baseimportnoop_serialization,noop_deserialization,dict_serialization,dict_deserialization,list_deserialization,SerializerJSONSerializer=Serializer(serialization_functions={dict:lambdadct:dict_serialization(dct,key_serialization_func=JSONSerializer.serialize,value_serialization_func=JSONSerializer.serialize),list:lambdalst:list(map(JSONSerializer.serialize,lst)),(str,int,float,bool,type(None)):noop_serialization},deserialization_functions={dict:lambdacls,dct:dict_deserialization(cls,dct,key_deserialization_func=JSONSerializer.deserialize,value_deserialization_func=JSONSerializer.deserialize),list:lambdacls,lst:list_deserialization(cls,lst,deserialization_func=JSONSerializer.deserialize),(str,int,float,bool,type(None)):noop_deserialization})
参考
dataclasses_serialization.serializer_base
使创建序列化程序更容易的实用程序的集合。
isinstance(o, t)
,issubclass(cls, clsinfo)
内置
isinstance
和issubclass
的扩展版本,将dataclass
视为数据类的元类,并可用于受支持的typing
类型。noop_serialization(obj)
,noop_deserialization(cls, obj)
琐碎的序列化/反序列化函数,通过不执行任何操作进行序列化。
dict_to_dataclass(cls, dct, deserialization_func=noop_deserialization)
与
dataclasses.asdict
相反,它将字典dct
反序列化为数据类cls
,使用deserialization_func
反序列化cls
的字段。字段使用数据类提供的类型反序列化。 因此,绑定的泛型数据类可以反序列化,而未绑定的泛型数据类则不能反序列化。
union_deserialization(type_, obj, deserialization_func=noop_deserialization)
反序列化一个
Union
type_
,方法是依次尝试每个类型,并返回第一个不引发DeserializationError
的类型。由于
Optional
s实现为Union
s,此函数也适用于它们。dict_serialization(obj, key_serialization_func=noop_serialization, value_serialization_func=noop_serialization)
,dict_deserialization(type_, obj, key_deserialization_func=noop_deserialization, value_deserialization_func=noop_deserialization)
通过对键和值应用适当的序列化/反序列化函数来序列化/反序列化字典
obj
。list_deserialization(type_, obj, deserialization_func=noop_deserialization)
通过对列表的值应用反序列化函数来反序列化列表
obj
。Serializer(serialization_functions, deserialization_functions)
常规序列化类。
获取序列化和反序列化函数的两个字典,并在通过
serialize
和deserialize
方法序列化/反序列化和对象时适当遵从它们。 序列化程序函数接受一个要序列化的对象参数,并返回其序列化版本。 反序列化程序函数接受两个参数,所需的反序列化对象类型和要反序列化的对象。默认情况下,
dataclass
es被序列化,就好像它们是dict
s一样。 类似地,使用dict_to_dataclass
反序列化dataclass
,使用union_deserialization
反序列化Union
,使用自身作为嵌套的反序列化函数。使用
serializer.serialize(obj)
序列化python对象,并使用serializer.deserialize(cls, serialized_obj)
反序列化。使用
serializer.register_serializer(cls, func)
、serializer.register_deserializer(cls, func)
和serializer.register(cls, serialization_func, deserialization_func)
注册更多序列化/反序列化函数。 它们也可以用作装饰器,如so:@serializer.register_serializer(int)defint_serializer(obj):...
@serializer.register_deserializer(int)defint_deserializer(cls,obj):...
SerializationError
,DeserializationError
分别在序列化/反序列化失败时引发的错误。
dataclasses_serialization.json
JSONSerializer
python数据类和json对象之间的序列化器/反序列化器。
>>> JSONSerializer.serialize(InventoryItem("Apple",0.2,20)){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> JSONSerializer.deserialize(InventoryItem,{'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
< P>在使用混合数据时,将^ {< CD50>}和^ {CD5>}方法添加到数据集中。JSONSerializerMixin
@dataclassclassInventoryItem(JSONSerializerMixin):...
>>> InventoryItem("Apple",0.2,20).as_json(){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> InventoryItem.from_json({'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
JSONStrSerializer
python数据类和json字符串之间的序列化器/反序列化器。
>>> JSONStrSerializer.serialize(InventoryItem("Apple",0.2,20))'{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}'>>> JSONStrSerializer.deserialize(InventoryItem,'{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}')InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
当用作子项时,添加到“{”>“{”和“{”>“}”。JSONStrSerializerMixin
@dataclassclassInventoryItem(JSONStrSerializerMixin):...
>>> InventoryItem("Apple",0.2,20).as_json_str()'{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}'>>> InventoryItem.from_json_str('{"name": "Apple", "unit_price": 0.2, "quantity_on_hand": 20}')InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
dataclasses_serialization.bson
BSONSerializer
python数据类和bson对象之间的序列化器/反序列化器。
>>> BSONSerializer.serialize(InventoryItem("Apple",0.2,20)){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> BSONSerializer.deserialize(InventoryItem,{'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
< P>在使用混合数据时,将^ ^ {CD59}和^ {CD60>}方法添加到数据集中。BSONSerializerMixin
@dataclassclassInventoryItem(BSONSerializerMixin):...
>>> InventoryItem("Apple",0.2,20).as_bson(){'name': 'Apple', 'unit_price': 0.2, 'quantity_on_hand': 20}>>> InventoryItem.from_bson({'name':'Apple','unit_price':0.2,'quantity_on_hand':20})InventoryItem(name='Apple', unit_price=0.2, quantity_on_hand=20)
BSONStrSerializer
python数据类和二进制bson字符串之间的序列化程序/反序列化程序。
< P>在使用混合数据时,将^ {< CD6>}和^ {CD64 >}方法添加到数据集中。BSONStrSerializerMixin
@dataclassclassInventoryItem(BSONStrSerializerMixin):...
安装
使用标准的python包管理器进行安装和更新pip:
pip install dataclasses_serialization