58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
|
import gc
|
||
|
|
||
|
from . import msgpack
|
||
|
from .msgpack import msgpack_encoders, msgpack_decoders # noqa: F401
|
||
|
from .util import force_path, FilePath, JSONInputBin, JSONOutputBin
|
||
|
|
||
|
|
||
|
def msgpack_dumps(data: JSONInputBin) -> bytes:
|
||
|
"""Serialize an object to a msgpack byte string.
|
||
|
|
||
|
data: The data to serialize.
|
||
|
RETURNS (bytes): The serialized bytes.
|
||
|
"""
|
||
|
return msgpack.dumps(data, use_bin_type=True)
|
||
|
|
||
|
|
||
|
def msgpack_loads(data: bytes, use_list: bool = True) -> JSONOutputBin:
|
||
|
"""Deserialize msgpack bytes to a Python object.
|
||
|
|
||
|
data (bytes): The data to deserialize.
|
||
|
use_list (bool): Don't use tuples instead of lists. Can make
|
||
|
deserialization slower.
|
||
|
RETURNS: The deserialized Python object.
|
||
|
"""
|
||
|
# msgpack-python docs suggest disabling gc before unpacking large messages
|
||
|
gc.disable()
|
||
|
msg = msgpack.loads(data, raw=False, use_list=use_list)
|
||
|
gc.enable()
|
||
|
return msg
|
||
|
|
||
|
|
||
|
def write_msgpack(path: FilePath, data: JSONInputBin) -> None:
|
||
|
"""Create a msgpack file and dump contents.
|
||
|
|
||
|
location (FilePath): The file path.
|
||
|
data (JSONInputBin): The data to serialize.
|
||
|
"""
|
||
|
file_path = force_path(path, require_exists=False)
|
||
|
with file_path.open("wb") as f:
|
||
|
msgpack.dump(data, f, use_bin_type=True)
|
||
|
|
||
|
|
||
|
def read_msgpack(path: FilePath, use_list: bool = True) -> JSONOutputBin:
|
||
|
"""Load a msgpack file.
|
||
|
|
||
|
location (FilePath): The file path.
|
||
|
use_list (bool): Don't use tuples instead of lists. Can make
|
||
|
deserialization slower.
|
||
|
RETURNS (JSONOutputBin): The loaded and deserialized content.
|
||
|
"""
|
||
|
file_path = force_path(path)
|
||
|
with file_path.open("rb") as f:
|
||
|
# msgpack-python docs suggest disabling gc before unpacking large messages
|
||
|
gc.disable()
|
||
|
msg = msgpack.load(f, raw=False, use_list=use_list)
|
||
|
gc.enable()
|
||
|
return msg
|