Что такое сериализация данных?

Прежде всего, я не смог получить четкого определения этого из WikiPedia или даже из сериализовать в PHP руководстве. Мне нужно знать некоторые случаи, когда нам нужен термин сериализация и как обстоят дела без него? Другими словами, где вам нужна сериализация, а без нее в вашем коде будет отсутствовать какая-то важная функция.


person Community    schedule 05.08.2012    source источник
comment
Что вы подразумеваете под нам нужен термин сериализация? Сериализация — это метод описания структуры данных с информацией о самой структуре, встроенной в данные. JSON — это упрощенный тип сериализации, например, {prop:{prop:1}}. Перенесите это на другой компьютер, и, как минимум, вы сможете работать со свойствами этого объекта с той же базовой взаимосвязью prop.prop.   -  person Jared Farrish    schedule 05.08.2012
comment
Я имею в виду, когда нам это нужно? просто!   -  person    schedule 05.08.2012
comment
Когда вам нужно перенести структуру данных через некоторую границу, в которой вам затем нужно восстановить эту же структуру в какой-то более поздний момент. Вы минимально описываете данные более подробным образом, чем просто какое-то конкретное, единственное сопоставление ключ-переменная.   -  person Jared Farrish    schedule 05.08.2012
comment
@JaredFarrish, значит, вы имеете в виду, что я могу сериализовать данные по-своему, а слово «сериализация» произошло от создания серий. то есть можем ли мы рассматривать массивы как сериализованные данные?   -  person    schedule 05.08.2012
comment
Если вы хотите, конечно, я полагаю, вы можете создать свой собственный метод сериализации, но в большинстве случаев в этом нет необходимости. Есть много способов сделать это, json_encode является легким и уже обрабатывает массивы.   -  person Jared Farrish    schedule 05.08.2012


Ответы (5)


Что такое сериализация?

Сериализация кодирует объекты в другой формат.
Например, у вас есть такой массив в PHP:

$array = array("a" => 1, "b" => 2, "c" => array("a" => 1, "b" => 2));

И затем вы хотите сохранить его в файл или отправить в другое приложение.

Существует несколько вариантов формата, но идея одна и та же: массив должен быть закодирован (или, можно сказать, переведен) в текст или байты, которые можно записать в файл или отправить по сети.
Для например, в PHP, если вы:

$data = serialize($array);

вы получите это:

a:3:{s:1:"a";i:1;s:1:"b";i:2;s:1:"c";a:2:{s:1:"a";i:1;s:1:"b";i:2;}}

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

$array = unserialize($data);

Но вы можете выбрать другой формат сериализации, например, JSON:

$json = json_encode($array);

даст вам это:

{"a":1,"b":2,"c":{"a":1,"b":2}}

Результат не только легко сохраняется, читается человеческим глазом или отправляется по сети, но также понятен практически для любого другого языка (JavaScript, Java, C#, C++, ...)

Заключение
Сериализация переводит объекты в другой формат, если вы хотите хранить данные или делиться ими.

Бывают ли ситуации, когда вы ничего не можете сделать, кроме как сериализовать это?

Нет. Но сериализация обычно упрощает задачу.

Являются ли форматы JSON и PHP единственными возможными форматами?
Нет, нет, нет и еще раз нет. Форматов очень много.

  • XML, у которого есть преемники, такие как SOAP, WSDL и т. Д. (У них есть конкретная цель)
  • Байты, Protobuf и т.д.
  • Ямл
  • ...
  • ...
  • Ваши собственные форматы (вы можете создать свой собственный формат для сериализации и использовать его, но это большая вещь, и в большинстве случаев она того не стоит)
person Dovydas Navickas    schedule 05.08.2012
comment
Как вы отправляете ссылки на объекты в памяти на другие компьютеры или сохраняете на диск без сериализации? На мой взгляд, это не просто сложнее, а невозможно. - person Esailija; 05.08.2012
comment
Во многих случаях я думаю, что большая часть смысла сериализации заключается в том, что она независима от языка. Вы не выбираете язык, когда выбираете метод сериализации, вы выбираете представление, которое поддерживается между двумя точками, которые могут быть одним и тем же или разными языками, интерпретируя его из или в собственный язык. структура. - person Jared Farrish; 05.08.2012
comment
XML, у которого есть предшественники, такие как SOAP, WSDL. Это утверждение неверно. SOAP и WSDL не являются предшественниками XML; WSDL является XML, а SOAP является средством для описания и вызова объектов между системами. XML существует гораздо дольше, чем любой из них, и является основным синтаксисом для описания данных. - person Jared Farrish; 05.08.2012
comment
Эсаилии: иногда дело не в том, насколько это сложно, а в том, насколько эффективно. Например, если вам нужно отправить только объект класса Name, Surname и Credentials of Person, пока вы не отправите его раз в неделю - вы этого не почувствуете. Но стоит ли отправлять его раз в секунду... А что с безопасностью? Если вы сериализуете весь объект и отправляете его по беспроводной сети без шифрования, люди могут отсканировать его и получить номера социального страхования, банковскую информацию и т. д. Так что в таких ситуациях я действительно считаю, что сериализация не вариант. - person Dovydas Navickas; 05.08.2012
comment
Джареду Фарришу: мой плохой. Должен был быть преемник слова, а не предшественник. Уже отредактировал :) - person Dovydas Navickas; 05.08.2012
comment
@DovydasNavickas: но вам все равно нужно сериализовать его в какой-то поток битов и байтов. Формат сериализации, конечно же, зависит от требований к производительности, и для добавления уровня безопасности вам потребуется зашифровать связь. Тем не менее, это все еще называется сериализацией. - person Bergi; 05.08.2012
comment
Технически можно записать все сразу в байтах, но, конечно, этого почти никто не делает. И я понимаю, что вы говорите, и да, даже если мы не сериализуем сами объекты, мы конвертируем их части в байты. По крайней мере, в ситуации, которую я описал ранее. Но вопрос был в том, есть ли ситуации, когда не сериализация объекта делает решение невозможным? (Я перефразировал это, но идея та же самая). И ответ - да, но это сложнее. И я верю, что это то, что я сказал :) - person Dovydas Navickas; 06.08.2012
comment
Хороший обзор. Спасибо! В дополнение я нашел этот пост в блоге, в котором быстро показана структура сериализованных массивов PHP. На их примере легко читать (и редактировать) сериализованные элементы в базе данных WordPress ;-) wp-staging.com/serialized-data-wordpress-important Похоже, что a означает массив, за которым следует количество элементов. Внутри фигурных скобок этого массива s обозначает строку и указывает количество символов в следующей строке. Строки чередуются между именем ключа и его значением для каждого элемента в массиве. Любое значение также может быть сериализованным массивом. - person SherylHohman; 15.06.2019

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

Формат сериализации может быть как совместимым, так и несовместимым. Интероперабельные форматы (такие как JSON, XML, ...) позволяют сериализовать некоторый объект с использованием данной платформы и десериализовать его с использованием другой платформы. Например, с помощью JSON вы можете использовать javascript для сериализации объекта и отправки его по сети в PHP-скрипт, который десериализует объект и будет использовать его.

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

Вы можете использовать json_encode и json_decode() для сериализации/десериализации объектов PHP с использованием формата взаимодействия JSON.

person Darin Dimitrov    schedule 05.08.2012
comment
Это означает, что я могу сериализовать данные любым способом, каким захочу, но они должны быть перечислены в виде серии блоков, чтобы мы могли называть массивы сериализованными данными?! - person ; 05.08.2012
comment
Нет точно. Массивы не являются сериализованными данными. Массивы живут в памяти. Они объекты. Как только вы сериализуете их, используя какой-либо формат, они преобразуются в некоторое представление байтов, которое можно сохранить или отправить по сети. Точное представление будет зависеть от выбранного вами формата сериализации. - person Darin Dimitrov; 05.08.2012
comment
@DarinDimitrov Спасибо за ваш комментарий, заставил меня взглянуть на ваш ответ и кое-что узнать ;-) - person Pioul; 05.08.2012
comment
Это должен быть принятый ответ, у другого есть неразрешенные разногласия: P - person Esailija; 05.08.2012
comment
Это тоже хороший ответ, но я чувствую, что ответ, который я выбрал, более ясный и прямой. - person ; 05.08.2012
comment
Я всегда задавался вопросом, основано ли глубоко внутри общеязыковой среды выполнения на сериализации. Я не могу вспомнить, что такое низкоуровневый язык, но именно это меня поразило, когда я некоторое время назад читал статью об этом. - person Jared Farrish; 05.08.2012
comment
Это действительно хорошее объяснение. - person Wolverine; 23.12.2016

Сериализация — это процесс преобразования данных (например, переменных) в представление, такое как строка, которую можно легко записать и прочитать, например, из файла или базы данных.

Случаи применения? Их много, но обычно они вращаются вокруг идеи взять сложный вложенный массив или объект и превратить его в простую строку, которую можно сохранить и прочитать позже, чтобы получить ту же структуру. Например, если у вас есть в php:

$blub = array();
$blub['a'] = 1;
$blub['a']['b'] = 4;
$blub['b'] = 27;
$blub['b']['b'] = 46;

Вместо того, чтобы просматривать каждый элемент массива по отдельности и записывать его, можно было бы просто:

$dataString = serialize($blub);

И сериализованный массив готов к записи в любом месте в виде простой строки таким образом, что повторное получение этой строки и выполнение над ней unserialize() дает вам точно такую ​​же структуру массива, которая была у вас раньше. Да, это действительно так просто.

person Mahn    schedule 05.08.2012

Мне нужно знать, в каких случаях нам нужен термин сериализация и как обстоят дела без него?

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

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

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

Другими словами, где вам нужна сериализация, а без нее в вашем коде будет отсутствовать какая-то важная функция.

Это был один пример. Это не всегда нужно, но если что-то становится более сложным, сериализация может быть полезной.

person hakre    schedule 05.08.2012
comment
Я сделал то же самое с результатом тренировочного экзамена. Я храню вопросы и ответы в строке с записью, чтобы в случае последующего обновления вопроса содержание экзамена в том виде, в котором он был сдан, все еще сохранялось. Конечно, он мог бы быть таким же описательным и спроектированным более полно, но в этом действительно не было необходимости, поэтому его сериализация была идеальным компромиссом, и так было в течение 5 с лишним лет. - person Jared Farrish; 05.08.2012

Поскольку вы пометили его javascript, одним из видов сериализации может быть сериализация форм.

Вот ссылки на jQuery и prototype.JS.

Что они в основном делают, так это сериализуют входные значения формы в пары "имя-значение", разделенные запятыми.

Итак, учитывая фактическое использование ..

$.ajax({
   url : 'insert.php?a=10,b=15' //values serialized via .serialize()
   type: 'GET'
});

И вы, вероятно, сделали бы $GET["a"], чтобы получить эти значения, хотя я не знаком с PHP.

person Robin Maben    schedule 05.08.2012
comment
Я не знаю, строго ли это сериализация. - person Jared Farrish; 05.08.2012
comment
@Said Bakr: Я бы сказал, больше для использования, чем для языка. Определение всегда одно и то же. Все сводится к передаче данных от A к B таким образом, чтобы их можно было извлечь обратно и деконструировать. - person Robin Maben; 05.08.2012