Сериализовать или json в PHP?


Поэтому мне нужно закодировать массив в PHP и сохранить его в виде обычного текста в базе данных MySQL, мой вопрос в том, должен ли я использовать serialize() или json_encode()? Каковы преимущества и недостатки каждого из них?

Я думаю, что любой из них подошел бы в этой ситуации. Но какой из них вы бы предпочли и почему? Если это для чего-то другого, кроме массива?

Author: datasn.io, 2010-04-04

6 answers

Основное преимущество serialize: он специфичен для PHP, что означает, что он может представлять типы PHP, включая экземпляры ваших собственных классов - и вы получите свои объекты обратно, все еще экземпляры ваших классов, при несериализации ваших данных.


Основное преимущество json_encode: JSON не является специфичным для PHP: существуют библиотеки для чтения/записи на нескольких языках, что означает, что лучше, если вы хотите что-то, чем можно управлять с помощью другого языка, чем PHP.

Строку JSON также легче читать/записывать/изменять вручную, чем сериализованную.

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


В качестве пары дополнительных примечаний:

  • Даже если между этими двумя есть небольшая разница в скорости, это не должно иметь большого значения: вы, вероятно, не будете сериализовывать/не сериализовывать много данных
  • Вы уверены, что это лучший способ хранения данных в базе данных?
    • Вы не сможете выполнять много запросов к сериализованным строкам в БД: вы не сможете использовать свои данные в предложениях where или обновлять их без вмешательства PHP...
 48
Author: Pascal MARTIN, 2010-04-04 14:44:24

Я провел некоторый анализ кодирования Json и сериализации в PHP. И я обнаружил, что Json лучше всего подходит для простых и понятных данных, таких как массив.

Смотрите результаты моих экспериментов в https://www.shozab.com/php-serialization-vs-json-encoding-for-an-array/

 9
Author: Shozab Hasan, 2018-03-26 09:41:19

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

Так что подумайте об этом очень тщательно, если это такая ситуация.

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

 5
Author: cletus, 2010-04-04 14:39:58

Еще одним преимуществом json_encode по сравнению с serialize является размер. Я заметил, что, когда я пытался понять, почему наша memcache используемая память становится такой большой, и пытался найти способы уменьшить это:

<?php

$myarray = array();
$myarray["a"]="b";
$serialize=serialize($myarray);
$json=json_encode($myarray);
$serialize_size=strlen($serialize);
$json_size=strlen($json);
var_dump($serialize);
var_dump($json);
echo "Size of serialized array: $serialize_size\n";
echo "Size of json encoded array: $json_size\n";
echo "Serialize is " . round(($serialize_size-$json_size)/$serialize_size*100) . "% bigger\n";

Что дает вам:

string(22) "a:1:{s:1:"a";s:1:"b";}"
string(9) "{"a":"b"}"
Size of serialized array: 22
Size of json encoded array: 9
Serialize is 59% bigger

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

 5
Author: Max, 2012-04-13 15:20:03

Во-первых, спасибо Шозабу Хасану и пользователю 359650 за эти тесты. Мне было интересно, какой выбор был лучшим, и теперь я знаю:

Для кодирования простого массива, JSON, который подходит как для PHP, так и для javascript, возможно, для других языков.

Для кодирования объекта PHP сериализация является лучшим выбором из-за специфики объектов PHP, которые могут быть созданы только с помощью PHP.

Для хранения данных либо храните закодированные данные в файле, либо используйте MySQL в стандартном формате. Было бы гораздо проще получить ваши данные вернулись. MySQL обладает отличными функциями для получения данных так, как вы хотели бы получить их без обработки PHP.

Я никогда не проводил никаких тестов, но я думаю, что хранилище файлов - лучший способ хранения ваших данных, если системной сортировки файлов достаточно, чтобы вернуть ваши файлы в алфавитном/цифровом порядке. MySQL слишком жаден для такого рода обработки и тоже использует файловую систему...

 3
Author: Vidda, 2012-11-04 23:28:02

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

Если вы передадите сериализованные данные в другое приложение, вам следует использовать JSON или XML для совместимости.

Но хранение сериализованного объекта в базе данных? Может быть, тебе стоит подумать об этом еще раз. Это может быть реально неприятности потом.

 2
Author: selfawaresoup, 2010-04-04 14:55:10