Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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


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

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

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


Как пара побочных действий:

  • Даже если есть небольшая разница в скорости между этими двумя, это не имеет большого значения: вы, вероятно, не сериализуете/несериализуете много данных.
  • Вы уверены, что это лучший способ хранения данных в базе данных?
    • Вы не сможете делать много запросов на сериализованных строках в БД: вы не сможете использовать свои данные в предложениях where или не обновлять его без вмешательства PHP...

Ответ 2

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

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

Ответ 3

Другим преимуществом 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.

Ответ 4

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

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

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

Ответ 5

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

Чтобы закодировать простой массив, JSON, который работает как с PHP, так и с javascript, возможно, с другими языками.

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

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

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

Ответ 6

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

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

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