Поэтому мне нужно закодировать массив в PHP и сохранить его в виде простого текста в базе данных MySQL, мой вопрос: следует ли использовать serialize () или json_encode ()? Каковы преимущества и недостатки каждого из них?
Я думаю, что любой из них будет делать в этой ситуации. Но какой из них вы бы предпочли и почему? Если это для чего-то другого, кроме массива?
Главное преимущество serialize
: оно специфично для PHP, что означает, что он может представлять типы PHP , включая экземпляры ваших собственных классов, – и вы будете возвращать свои объекты, все еще экземпляры ваших классов, при нессериализации ваших данных.
Главное преимущество json_encode
: JSON не специфичен для PHP: есть библиотеки для чтения / записи на нескольких языках – это означает, что лучше, если вы хотите что-то, с чем можно манипулировать с помощью другого языка, кроме PHP.
Строку JSON также легче читать / писать / модифицировать вручную, чем сериализованную.
С другой стороны, поскольку JSON не специфичен для PHP, он не знает о том, что характерно для PHP-подобных типов данных.
Как пара побочных действий:
Я сделал некоторый анализ Json Encoding vs Serialization в PHP. И я обнаружил, что Json лучше всего подходит для простых и простых данных, таких как массив.
См. Результаты моих экспериментов на http://blog.shozab.net/php-serialization-vs-json-encoding-for-an-array/
Ну, во-первых, сериализация массива или объекта и сохранение его в базе данных, как правило, является запахом кода. Иногда люди вставляют список, разделенный запятыми, в столбец, а затем попадают во всевозможные проблемы, когда позже выясняют, что им нужно запросить его.
Поэтому очень тщательно подумайте об этом, если это такая ситуация.
Что касается различий. Сериализация PHP, вероятно, более компактна, но применима только к PHP. JSON является кросс-платформенным и, возможно, медленнее для кодирования и декодирования (хотя я сомневаюсь, что это так).
Другим преимуществом json_encode
serialize
является размер. Я заметил, что, когда я пытался понять, почему наша память использовала память, она становилась такой большой и пыталась найти способы уменьшить:
<?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.
Во-первых, благодаря Shozab Hasan и user359650 для этих тестов. Мне было интересно, какой выбор был лучшим, и теперь я знаю:
Чтобы закодировать простой массив, JSON, который в порядке с PHP и javascript, возможно, другими языками.
Чтобы закодировать объект PHP, сериализация – лучший выбор из-за специфики PHP-объектов, которые не поддаются проверке с помощью PHP.
Чтобы хранить данные, либо храните закодированные данные в файле, либо используйте MySQL со стандартным форматом. Было бы намного проще вернуть ваши данные. MySQL имеет отличные функции для получения данных, как вы хотели бы получить их без обработки PHP.
Я никогда не делал никаких тестов, но я думаю, что хранение файлов – лучший способ сохранить ваши данные, если сортировка системных файлов достаточно, чтобы вернуть ваши файлы в алфавитном порядке / порядке. MySQL является жадным для такого рода лечения и использует файловую систему тоже …
Если вам никогда не придется покидать ваше PHP-приложение, я рекомендую serialize (), потому что он предлагает множество дополнительных функций, таких как методы __sleep () и __wakeup () для ваших объектов. Он также восстанавливает объекты как экземпляры правильных классов.
Если вы передадите сериализованные данные в другое приложение, вы должны использовать JSON или XML для совместимости.
Но хранить сериализованный объект в базу данных? Возможно, вам стоит подумать об этом еще раз. Это может быть настоящая проблема позже.