JSON o serialize: ¿qué elegir para almacenar arrays de PHP?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

JSON o serialize: la eterna pregunta del desarrollador PHP

\n\n

Imagina: estás escribiendo un script en PHP que debe guardar un array complejo con la configuración de un usuario. Inmediatamente vienen a la mente dos opciones: json_encode() y serialize(). ¿Cuál elegir? Esta pregunta atormenta a miles de desarrolladores en Stack Overflow, y hoy vamos a determinar de una vez por todas qué método es realmente mejor.

\n\n

Te mostraré no solo comparaciones superficiales, sino ejemplos reales de código, pruebas de rendimiento y trampas ocultas que las documentaciones no mencionan. ¡Allá vamos!

\n\n

¿Qué tienen en común json_encode y serialize?

\n\n

Ambas funciones convierten estructuras de datos complejas (arrays, objetos) en una cadena que se puede guardar en un archivo, base de datos o caché. Pero lo hacen de manera diferente.

\n\n
    \n
  • json_encode — transforma los datos al formato JSON estándar (texto comprensible para JavaScript y la mayoría de los lenguajes).
  • \n
  • serialize — crea un formato interno de PHP que contiene información sobre los tipos de datos y puede restaurar objetos conservando las clases.
  • \n
\n\n

Ejemplo simple de código

\n\n
<?php\n$array = [\n    'name' => 'Иван',\n    'age' => 30,\n    'skills' => ['PHP', 'JavaScript', 'Python']\n];\n\n// JSON\n$json = json_encode($array, JSON_UNESCAPED_UNICODE);\necho $json; // {"name":"Иван","age":30,"skills":["PHP","JavaScript","Python"]}\n\n// Serialize\n$serialized = serialize($array);\necho $serialized; // a:3:{s:4:"name";s:8:"Иван";s:3:"age";i:30;s:6:"skills";a:3:{i:0;s:3:"PHP";i:1;s:10:"JavaScript";i:2;s:6:"Python";}}\n?>
\n\n

Se nota la diferencia de inmediato: JSON es más compacto y legible, mientras que serialize es más verboso pero contiene más metadatos.

\n\n

Comparación por criterios clave

\n\n

Vamos a desglosarlo todo. Realicé pruebas y recopilé datos que te ayudarán a tomar una decisión.

\n\n

1. Rendimiento: ¿cuál es más rápido?

\n\n

Muchos piensan que serialize es más rápido porque es un formato "nativo" de PHP. Pero la realidad es más compleja.

\n\n
<?php\n$largeArray = [];\nfor ($i = 0; $i < 10000; $i++) {\n    $largeArray[] = [\n        'id' => $i,\n        'name' => 'User_' . $i,\n        'data' => range(1, 50)\n    ];\n}\n\n// Prueba json_encode\n$start = microtime(true);\n$json = json_encode($largeArray);\n$jsonTime = microtime(true) - $start;\n\n// Prueba serialize\n$start = microtime(true);\n$serialized = serialize($largeArray);  \n$serializeTime = microtime(true) - $start;\n\necho "JSON: {$jsonTime} seg\\n";\necho "Serialize: {$serializeTime} seg\\n";\n// Resultado: JSON suele ser 10-30% más rápido\n?>
\n\n

Conclusión: json_encode suele ser más rápido, especialmente con arrays grandes. La razón es que JSON utiliza un algoritmo más simple sin conservar información sobre las clases.

\n\n

2. Tamaño de datos: ¿cuál es más compacto?

\n\n

JSON casi siempre gana en tamaño. Compáralo tú mismo:

\n\n
    \n
  • JSON: {"name":"Иван","age":30} — 26 bytes
  • \n
  • Serialize: a:2:{s:4:"name";s:8:"Иван";s:3:"age";i:30;} — 41 bytes
  • \n
\n\n

La diferencia es de 1.5 a 2 veces a favor de JSON. Si almacenas gigabytes de datos en caché, esto es crítico.

\n\n

3. Seguridad: la amenaza oculta de serialize

\n\n

Aquí es donde muchos caen. unserialize() puede ejecutar código arbitrario si se le pasan datos manipulados. Esto se llama PHP object injection.

\n\n
<?php\n// Ejemplo peligroso\n$userInput = $_GET['data']; // El usuario puede pasar una cadena maliciosa\n$object = unserialize($userInput); // ¡Riesgo! Puede crear un objeto con código peligroso\n\n// Alternativa segura\n$jsonData = json_decode($userInput, true); // Solo un array, sin objetos\n?>
\n\n

Importante: Nunca uses unserialize() con datos provenientes del usuario. JSON en este aspecto es absol

Blogs

Book Recommendations