¿Serialize o json en PHP?

Entonces, necesito codificar una matriz en PHP y almacenarla en texto plano en la base de datos MySQL, mi pregunta es si debo usar serialize () o json_encode ()? ¿Cuáles son las ventajas y desventajas de cada uno de ellos?

Creo que cualquiera de ellos lo haría en esta situación. ¿Pero cuál preferirías y por qué? Si es por algo que no sea una matriz?

La principal ventaja de serialize : es específica de PHP, lo que significa que puede representar tipos de PHP , incluidas las instancias de sus propias clases, y recuperará sus objetos, instancias de sus clases, cuando extratermineice sus datos.

La principal ventaja de json_encode : JSON no es específico de PHP: hay bibliotecas para leerlo / escribirlo en varios idiomas, lo que significa que es mejor si quieres algo que pueda ser manipulado con otro idioma que no sea PHP.

Una cadena JSON también es más fácil de leer / escribir / modificar a mano que una cadena serial.

Por otro lado, como JSON no es específico de PHP, no es consciente de las cosas específicas de PHP, como los tipos de datos.

Como un par de notas al margen:

  • Incluso si hay una pequeña diferencia en la velocidad entre esos dos, no debería importar mucho: probablemente no serializará ni deserializará una gran cantidad de datos.
  • ¿Estás seguro de que esta es la mejor manera de almacenar datos en una base de datos?
    • No podrás hacer muchas consultas en strings serializados, en un DB: no podrás utilizar tus datos en cláusulas where , ni actualizarlos sin la intervención de PHP …

Hice algunos análisis sobre Json Encoding vs Serialization en PHP. Y descubrí que Json es mejor para datos simples y simples como una matriz.

Vea los resultados de mis experimentos en http://blog.shozab.net/php-serialization-vs-json-encoding-for-an-array/

Otra ventaja de json_encode sobre serialize es el tamaño. Noté que mientras trataba de descubrir por qué nuestra memcache utilizaba memoria se estaba haciendo tan grande, y estaba tratando de encontrar formas de reducirla:

 < ?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"; 

Lo que te da:

 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 

Obviamente, he tomado el ejemplo más extremo, cuanto más corta es la matriz, más importante es la sobrecarga con serializar. Todavía de un sitio web de producción veo una matriz serializada que es 20% más grande que su equivalente json.

Bueno, en primer lugar serializar una matriz u objeto y almacenarlo en una base de datos suele ser un olor a código. A veces las personas terminan colocando una lista separada por comas en una columna y luego se meten en todo tipo de problemas cuando más tarde descubren que necesitan consultarla.

Así que piensa con mucho cuidado sobre eso si este es ese tipo de situación.

En cuanto a las diferencias. PHP serialize es probablemente más compacto pero solo utilizable con PHP. JSON es multiplataforma y posiblemente más lento de codificar y decodificar (aunque lo dudo mucho).

Primero, gracias a Shozab Hasan y user359650 para estas pruebas. Me preguntaba qué opción era la mejor y ahora sé:

Para codificar una matriz simple, JSON que está bien con PHP Y javascript, tal vez otros idiomas.

Para codificar un objeto PHP, serializar es una mejor opción debido a la especificidad de los objetos PHP solo instanciable con PHP.

Para almacenar datos, almacene datos codificados en un archivo o use MySQL con formato estándar. Sería mucho más fácil recuperar tus datos. MySQL tiene excelentes funciones para obtener datos de la manera en que le gustaría obtenerlos sin tratamiento de PHP.

Nunca hice ninguna prueba, pero creo que el almacenamiento de archivos es la mejor manera de almacenar sus datos si la clasificación de archivos del sistema es suficiente para recuperar sus archivos en orden alfabético / numérico. MySQL es codicioso para este tipo de tratamiento y también utiliza el sistema de archivos …

Si sus datos nunca tendrán que abandonar su aplicación PHP, recomiendo serialize () porque ofrece muchas funcionalidades adicionales como los métodos __sleep () y __wakeup () para sus objetos. También restaura objetos como instancias de las clases correctas.

Si pasa los datos serializados a otra aplicación, debe usar JSON o XML para compatibilidad.

¿Pero almacenar un objeto serializado en una base de datos? Quizás deberías pensar en eso de nuevo. Puede ser un problema real después.