Сериализация или JSON в PHP? - PullRequest
45 голосов
/ 04 апреля 2010

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

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

Ответы [ 6 ]

49 голосов
/ 04 апреля 2010

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


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

Строка JSON также проще для чтения / записи / изменения от руки , чем для сериализации.

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


Как пара сиденот:

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

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

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

6 голосов
/ 13 апреля 2012

Еще одним преимуществом 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 голосов
/ 04 апреля 2010

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

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

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

3 голосов
/ 05 ноября 2012

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

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

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

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

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

2 голосов
/ 04 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...