Serialize with type annotations
Project description
type-serialize
Serialize with type annotations
Features
- Supported in Python 3.9 and later.
- Serialize classes without additional code.
- Custom classes
- @dataclas
- NamedTuple
- Enum
- (Experimental) numpy.ndarray
- Deserialization using type annotations.
- No dependencies
Compress serialization results: bz2, gzip, lzma, zlib- Removed to focus on 'serialization' itself.
Overview
To pass a custom object to the json.dumps and json.loads functions, there is the following method.
- Expand json.JSONEncoder and json.JSONDecoder.
- Convert to built-in Python object supported by json.JSONEncoder and json.JSONDecoder.
Both methods require additional code and have some problems.
- Problem of not checking symbols when manipulating strings.
- When adding/deleting/editing a property, all related codes must be changed together.
- Painful typecasting (as the biggest problem).
As a way to hide these problems with a library and use serialization and deserialization, I chose type annotations. (Although the library is complicated; haha...) There are some additional advantages to using this.
- Static type checking using mypy.
- Autocomplete in IDE like PyCharm.
Things to know
- All public fields are serialized.
- Methods are not serialized.
- Private fields that start with an underscore (
_) are not serialized. - Members specified with the
@propertydecorator are not serialized. - When deserializing, all fields must be type-annotated.
- A value of
Noneis ignored by the serialization target. - When deserializing, the
__init__function must have NO required arguments. - Implement
__serialize__to override the serialization method. - Implement
__deserialize__to override the deserialization method.
Installation
pip install type-serialize
Usage
Serializable python object
from dataclasses import dataclass
from type_serialize import deserialize, serialize
@dataclass
class Sample:
field1: str
field2: int
data = Sample(field1="a", field2=100)
obj = serialize(data)
assert isinstance(obj, dict)
assert obj["field1"] == "a"
assert obj["field2"] == 100
print(obj)
result = deserialize(obj, Sample)
assert isinstance(result, Sample)
assert data == result
print(result)
Override serialize and deserialize
from dataclasses import dataclass
from type_serialize import deserialize, serialize
@dataclass
class Sample:
value: int
def __serialize__(self):
return {"a": self.value}
def __deserialize__(self, data) -> None:
self.value = data["a"]
def __init__(self, value=100):
self.value = value
test = Sample(value=200)
obj = serialize(test)
assert isinstance(obj, dict)
assert obj["a"] == 200
print(obj)
result = deserialize(obj, Sample)
assert isinstance(result, Sample)
assert test == result
print(result)
License
See the LICENSE file for details. In summary, type-serialize is licensed under the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file type_serialize-2.1.0-py3-none-any.whl.
File metadata
- Download URL: type_serialize-2.1.0-py3-none-any.whl
- Upload date:
- Size: 14.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.21
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
787a6f6af9ba0d99adeea2509caa6e150acd7cc723171e6c2489194a53fd9007
|
|
| MD5 |
78b622917fbcc7d63be67e031d287e95
|
|
| BLAKE2b-256 |
15d4764068e815e7400c571c528abbb33966a951bd541fa733d16c91742bd582
|