Как можно определить сериализаторы и десериализаторы для объектов Python фиксированного типа / схемы?
Использование (стандартная библиотека) struct.pack
и struct.unpack
?
Да, но утомительно указывать нужные мне форматы для каждого нового типа / схемы, с которыми я сталкиваюсь. Разве нет способа максимизировать повторное использование кода и минимизировать ручную спецификацию?
Использование (стандартная библиотека) pickle
или marshal
(для простых типов)?
Нечто подобное, да, но это не сработает (как есть) по двум причинам:
1) Мне нужно иметь возможность контролировать представление объекта, потому что в (часто) случаи, когда у меня нет контроля над тем, как информация была сериализована в байты, наша задача на самом деле - создать десериализатор, который будет анализировать байты и создавать объект python с доступной информацией.
2) Каждый маринад содержит информацию метаданных о том, как извлечь данные (такие как тип и т. Д.). Смотрите фрагмент кода ниже, например. Мы хотим, чтобы эта информация была учтена. В одной и той же схеме эта информация фиксирована, и мы не хотим тратить байты, повторяя ее снова и снова.
>>> import pickle
>>> for x in [0, 1, 2, 3, 2**8 - 1, 2**8, 2**8 + 1, 2**64]:
... print(f"{x} pickled: {list(map(int, pickle.dumps(x)))}".rjust(80))
...
0 pickled: [128, 3, 75, 0, 46]
1 pickled: [128, 3, 75, 1, 46]
2 pickled: [128, 3, 75, 2, 46]
3 pickled: [128, 3, 75, 3, 46]
255 pickled: [128, 3, 75, 255, 46]
256 pickled: [128, 3, 77, 0, 1, 46]
257 pickled: [128, 3, 77, 1, 1, 46]
18446744073709551616 pickled: [128, 3, 138, 9, 0, 0, 0, 0, 0, 0, 0, 0, 1, 46]
Так что мне нужно что-то среднее между struct и pickle. Подобно pickle (или маршалу), но (1) параметризуемому (2) без метаданных.
Мы можем создать такой пакет с нуля с помощью библиотеки (Python Builtin) struct
, но, возможно, уже естьчто-то там для этого?