Python: параметризованная сериализация (без мета-байтов) - PullRequest
0 голосов
/ 10 октября 2019

Как можно определить сериализаторы и десериализаторы для объектов 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, но, возможно, уже естьчто-то там для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...