Serialization — это преобразование Python objects в текст для передачи по сети. Звучит как простая смена формата, но на деле это скорее перевод, а при переводе часть информации может потеряться.
В JSON всего семь типов, а у ваших objects их гораздо больше
Весь набор типов JSON — это
object, array, string, number, true, false, null. И всё. Никаких datetime, Decimal, set, UUID или bytes. Поэтому более сложные типы приходится преобразовывать, иначе json.dumps() завершится с TypeError:•
datetime, UUID, Decimal — соответствующего JSON-типа нет, поэтому их обычно преобразуют в строки•
set, bytes — прямого аналога тоже нет, поэтому нужно выбрать представление: например, set → list, а bytes → Base64•
tuple — незаметно превращается в array, а после десериализации возвращается уже как listПоследний пример отлично показывает суть проблемы. Вы сериализуете
tuple, а десериализуете уже list. Данные сохранились, но тип — нет.Object, который вы получаете обратно, — не обязательно тот же object, который вы отправили
Round trip через JSON может быть lossy.
datetime превращается в строку и останется строкой, пока кто-то явно не преобразует её обратно. Decimal, если привести его к float, чтобы он поместился в JSON, вернётся как float и потенциально потеряет точность.Serialization — это перевод на язык, в котором всего семь «слов». Всё, для чего в JSON есть собственный тип, сохраняется напрямую. Для всего остального нужны соглашения, понятные обеим сторонам, иначе информация не переживёт передачу.
Например, в Python:
json.loads(json.dumps(("a", "b")))вернёт:
["a", "b"]
Round trip сохранил значения, но изменил тип данных.
👉 @BackendPortal
