Зачем нужна сериализация?
===========================

> Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.

  

Всем привет.Обьясните на простом примере,зачем нужна не то чтобы сериализация,а именно модуль pickle || cPickle в python?Например записывая в файл или передавая в сокет данные мы можем указать в том же файле флаг b,чтобы запись производилась в двоичном режиме.Зачем нужно предварительно сериализовать обьект с помощью модуля pickle? 

 Предположим, есть у вас сложная иерархия классов, в каждом из которых с десяток полей. Некоторые поля ссылаются на объекты других классов или, того хуже, содержат коллекции объектов. При использовании сериализатора, вам достаточно одной строки для сохранения словаря, содержащего объекты из этой иерархии, в файл:  
`pickle.dump(some_dict, some_fh)`  

А если будете писать код для ручного сохранения всего этого изобилия в файл, то у вас либо получится объёмный, сложный и глючный код, либо ещё одна версия pickle. 

 Сериализация:  
* это обобщённый процесс для *структур* языка программирования.
* нужна для любого взаимодействия в системе, выходящего за рамки передачи данных в текущем скрипте: даже если вам кажется, что она не используется - это не так, она всё равно используется *под капотом*.

  

Сериализация *гарантирует* (для поддерживаемых структур данных), что после процесса сериализации/десериализации вы получите те же самые структуры данных.  
  

Не будь её, вам бы понадобилось вручную создавать свои протоколы и методы перевода данных в вид, пригодный для передачи куда-либо.  

Ну и, модуль pickle - это встроенная реализация сериализации, но в то же время - одна из многих. Вы можете использовать, например, json, или yaml. Что угодно, что переведёт обычные структуры данных в пригодную для передачи форму (строку, байтовая строка) и вернёт (десериализует) обратно. 

 Например, вам нужно передать структуру данных на удаленный сервер.  

Структура данных выглядит примерно так  

struct {  

 int age=17;  

 string name="Vasya";  

 date birthday="01/01/2001"  

}  
  

На удаленный сервер мы собираемся передавать обычным HTTP запросом, в который в принципе можно зааттачить XML, а можно передать просто одной строкой прямо в заголовке. Для этого мы можем нашу структуру данных серилизовать в строку, передать туда, там распаковать и получить сразу структуру.  

Разница в том, что мы на той стороне будем не "парсить" неизвестные данные, а именно десерилизовать. 

 Потому что сокет понимает только потоки данных, поскольку основан на протоколе tcp/ip? 

 Как банальный пример: Попробуйте засунуть массив в БД, не раскидывая его ключи по своим полям.  

Утрамбовали в сериализацию, записали в БД одной строкой, при надобности - достали, разсериализовали -> пользуемся