ezserialization - Simple, easy to use & transparent python objects serialization & deserialization.
EzSerialization is meant to be simple in features and usage. It follows these three ideas:
- Python dicts based. This package only helps to serialize objects to dicts. Converting them to JSON, XML, etc. is left to the user.
- Transparent serialization logic. It does not have automatic
from_dict()
&to_dict()
methods that convert class instances of any kind to dicts. Implementing them is left to the end-user, thus being transparent with what actually happens with this data. - Thread-safe. Serialization, deserialization & its enabling/disabling is thread-safe.
All EzSerialization do is it wraps to_dict()
& from_dict()
methods for selected classes to inject, register and
use class type information for deserialization.
Simply install from PyPI via pip command:
pip install ezserialization
Or use Poetry:
poetry install
To use this package:
- implement
Serializable
protocol for your classes by having definedto_dict()
andfrom_dict()
methods; - decorate your classes with
@serializable
.
During serialization, simply use your implemented to_dict()
method, and it will return
your defined dict {'some_value': 'wow', ...}
injected with class type information
{'_type_': 'example.module.Example', 'some_value': 'wow', ...}
.
During de-serialization (via deserialize()
method) the modified dict's _type_
property will be removed and used
to import example.module
module dynamically. Finally, the found Example
class' from_dict()
method will be used
to create new object from the original dict.
Here's an example:
from pprint import pprint
from typing import Mapping
from ezserialization import serializable, deserialize, no_serialization
@serializable
class Example:
def __init__(self, value: str):
self.value = value
def to_dict(self) -> dict:
return {"some_value": self.value}
@classmethod
def from_dict(cls, src: Mapping):
return cls(value=src["some_value"])
obj = Example("wow")
# Serialization without ability to automatically deserialize:
with no_serialization():
raw_obj_dict = obj.to_dict()
pprint(raw_obj_dict, indent=2)
# Output:
# {'some_value': 'wow'}
# Serialization WITH automatic deserialization:
obj_dict = obj.to_dict()
pprint(obj_dict, indent=2)
# Output:
# {'_type_': '__main__.Example', 'some_value': 'wow'}
obj2 = deserialize(obj_dict)
print(obj.value == obj2.value)
# Output:
# True
EzSerialization supports two context managers:
with no_serialization(): ...
- disables injecting class type metadata into the result ofto_dict()
method. Leaves the result dict unfit to be deserialized automatically viadeserialize()
;with use_serialization(): ...
- opposite ofno_serialization()
, enables class type metadata injection. Useful when using inside the disabled serialization scope.
Currently only a single option is available for customizing ezserialization
:
ezserialization.type_field_name
- by default it is set to_type_
, however if user's solution hasto_dict()
methods that already contain such field, an alternative field name can be set to override the default one.
Want to contribute? Create an issue ticket at GitHub & let's discuss 🤗