2016-01-17 3 views
3

Всякий раз, когда объект Python должен быть сохранен или отправлен по сети, он сначала сериализуется. Я думаю, причина в том, что хранение и сетевая передача основаны на битах. У меня есть глупый вопрос, который больше похож на вопрос основы информатики, чем на вопрос о python. Каким форматом занимаются объекты python, когда они находятся в кеше? Разве они не представляют собой биты? Если это так, почему бы просто не использовать эти биты для хранения или отправки объекта и почему нужно сериализовать?Сохранение данных на Python

+1

Быстрый ответ: * биты *, которые вы упомянули, должны быть очень зависимыми от платформы. – starrify

+0

@starrify. Можете ли вы объяснить больше об этом или можете ли вы показать мне статью или книгу, которые объясняют это хорошо? Благодаря! –

ответ

3

Бит Представление

Тот же объект может иметь различные представления в Биты на разных машинах:

  • Подумайте порядок байт (байт-заказ)
  • и архитектура (32 бита, 64 укуса)

Таким образом, представление объекта в Биты на машине-отправителе ничего не могут означать, (или, что еще хуже, может означать что-то еще), когда они получены на приемнике.

Возьмет простое число, 1025, в качестве иллюстрации проблемы:

  • На Big Endian машины Биты представления:
    • двоичные: 00000000 00000000 00000100 00000001
    • шестнадцатеричный: 0x00000401
  • в то время как на небольшом Endian m achine:
    • двоичная: 00000001 00000100 00000000 00000000
    • шестнадцатеричное 0x01040000

Вот почему, чтобы понять друг друга, 2 машины должны договориться о соглашении, протокол. Для протокола IP соглашение должно использовать, например, сетевой порядок байтов (big-endian).

Больше на in this question байтов

сериализации (и десериализации)

Мы не можем напрямую отправить объект, лежащий в основе представление битов в сети, по причинам, описанным выше, но не только.

Объект может ссылаться на другой объект внутри, через указатель (адрес в памяти этого второго объекта). Этот адрес, опять же, зависит от платформы.

Python решает это, используя алгоритм сериализации, называемый травлением, который преобразует иерархию объектов в байтовый поток. Этот байтовый поток, отправляемый по сети, по-прежнему зависит от платформы, и поэтому для обоих целей необходим протокол для понимания друг друга.

Pickle module documentation

+0

Означает ли это сериализацию python, например. процесс рассола преобразует биты в другой формат бит, который можно понять универсально всеми машинами? На высоком уровне вы можете пролить свет на то, как это реализовано? –

+0

@ David я обновил свой ответ с кратким объяснением о сериализации пути python, травление – arainone

+0

просто сделал то, что вы сказали, разделив комментарий на два. Чтобы лучше понять идею, могу ли я сделать такую ​​аналогию. Машины, использующие различное представление битов, похожи на две страны, использующие разный блок длины. Например, страна A использует ногу, а страна B использует passus. Обе страны знают, как конвертировать все свои собственные единицы и измеритель единицы измерения длины. Страна A просит страну B изготовить то, что составляет 1 фут. Это невозможно, потому что никто в стране B не понимает, как долго стоит 1 фут. –

1

Ключевым моментом для I/O является достижение interoperability, например, JSON, который вы отправляете по сети, возможно, потребуется передать по протоколу HTTP, а затем проанализировать JavaScript. И данные, которые вы храните на диске, возможно, потребуется прочитать при следующем запуске Python (другая среда выполнения, распределение памяти, ...).

Но для выполнения кода вы обычно хотите достичь более высокого уровня performance, чем то, что было бы возможно с использованием совместимых форматов, например. используя адреса ячейки памяти для доступа к методам объектов, элементам dict, ... или максимально оптимизируйте для processor cache.

Подробнее о том, как именно реализован python, вы можете посмотреть на один из interpreter implementations.

Смежные вопросы