JSON vs Serialize: ¿qué elegir para almacenar arrays en PHP? (guía completa)

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

Introducción: el dilema eterno del desarrollador PHP

\n\n

Todo desarrollador PHP se ha enfrentado alguna vez a la pregunta: "¿Cómo guardo un array en un archivo, base de datos o caché?". En Stack Overflow, la pregunta "Preferred method to store PHP arrays (json_encode vs serialize)" ha acumulado miles de visitas y decenas de respuestas. Y no es para menos, ya que la elección entre json_encode() y serialize() impacta en el rendimiento, la compatibilidad e incluso la seguridad de tu código.

\n\n

En este artículo analizaremos ambos métodos con ejemplos reales, compararemos sus fortalezas y debilidades, y te daremos recomendaciones claras sobre cuándo usar cada uno. ¡Vamos allá!

\n\n

¿Qué es la serialización en PHP?

\n\n

La serialización es el proceso de convertir una estructura de datos compleja (array, objeto) en una cadena que se pueda almacenar o transmitir. El proceso inverso se llama deserialización.

\n\n

PHP ofrece dos herramientas principales para esta tarea:

\n\n
    \n
  • serialize() / unserialize() — el mecanismo nativo de PHP.
  • \n
  • json_encode() / json_decode() — trabajo con el formato JSON.
  • \n
\n\n

En apariencia, ambos hacen lo mismo. Pero el diablo, como siempre, está en los detalles.

\n\n

Ejemplo 1: Array asociativo simple

\n\n

Empecemos con el caso más sencillo: un array asociativo con datos de usuario:

\n\n
<?php\n$user = [\n    'name' => 'Carlos',\n    'email' => 'carlos@example.com',\n    'age' => 30,\n    'is_admin' => false\n];\n\n// Serialización\n$serialized = serialize($user);\necho $serialized . PHP_EOL;\n// Salida: a:4:{s:4:"name";s:6:"Carlos";s:5:"email";s:19:"carlos@example.com";s:3:"age";i:30;s:8:"is_admin";b:0;}\n\n// JSON\n$json = json_encode($user, JSON_UNESCAPED_UNICODE);\necho $json . PHP_EOL;\n// Salida: {"name":"Carlos","email":"carlos@example.com","age":30,"is_admin":false}\n?>
\n\n

Ya en este punto se nota la diferencia: serialize() genera una cadena más "sucia" con tipos de datos (s: — string, i: — integer, b: — boolean). JSON, en cambio, se ve limpio y legible.

\n\n

Ejemplo 2: Array multidimensional

\n\n

Compliquemos un poco la tarea guardando un array con datos anidados, por ejemplo, una lista de productos en el carrito:

\n\n
<?php\n$cart = [\n    ['id' => 101, 'name' => 'Libro "PHP para profesionales"', 'price' => 1500, 'quantity' => 2],\n    ['id' => 102, 'name' => 'Curso "Maestro en JSON"', 'price' => 3000, 'quantity' => 1],\n    ['id' => 103, 'name' => 'Certificado', 'price' => 500, 'quantity' => 3]\n];\n\n// Comparemos el tamaño de las cadenas\n$serialized = serialize($cart);\n$json = json_encode($cart, JSON_UNESCAPED_UNICODE);\n\necho "Serialize: " . strlen($serialized) . " bytes\\n";\necho "JSON: " . strlen($json) . " bytes\\n";\n// Salida (aproximada):\n// Serialize: 218 bytes\n// JSON: 188 bytes\n?>
\n\n

Conclusión: JSON suele ser más compacto, especialmente para arrays grandes. Esto es crítico al almacenar en bases de datos o transmitir por red.

\n\n

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

\n\n

La velocidad es un factor clave. Probemos con 10,000 iteraciones:

\n\n
<?php\n$bigArray = [];\nfor ($i = 0; $i < 1000; $i++) {\n    $bigArray[] = [\n        'id' => $i,\n        'name' => 'Elemento #' . $i,\n        'data' => range(1, 10)\n    ];\n}\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n    $s = serialize($bigArray);\n    $us = unserialize($s);\n}\necho "Serialize: " . (microtime(true) - $start) . " seg\\n";\n\n$start = microtime(true);\nfor ($i = 0; $i < 10000; $i++) {\n    $j = json_encode($bigArray);\n    $uj = json_decode($j, true);\n}\necho "JSON: " . (microtime(true) - $start) . " seg\\n";\n?>
\n\n

Resultados (en PHP 8.2):

\n
    \n
  • Serialize: ~1.8 seg
  • \n
  • JSON: ~1.2 seg
  • \n
\n\n

Conclusión: JSON es más rápido tanto en codificación como en decodificación, especialmente con arrays grandes. La diferencia se vuelve más notoria a mayor escala.

\n\n

Compatibilidad: ¿funciona fuera de PHP?

\n\n

Aquí JSON gana por goleada. serialize() genera un formato propio de PHP que solo puede ser deserializado por PHP. JSON, en cambio, es un estándar universal soportado por todos los lenguajes de programación.

\n\n

Si estás construyendo una API REST, almacenando datos en Redis o intercambiando información con JavaScript, Python o cualquier otro lenguaje, JSON es la única opción viable.

\n\n

Seguridad: un punto crítico

\n\n

La función unserialize() es peligrosa si trabajas con datos de fuentes no confiables. Puede ejecutar código arbitrario si el atacante manipula la cadena serializada. Esto ha sido fuente de múltiples vulnerabilidades en aplicaciones PHP.

\n\n

Por el contrario, json_decode() es mucho más seguro, ya que solo interpreta datos y no ejecuta código.

\n\n

Regla de oro: Nunca uses unserialize() con datos de entrada del usuario o de fuentes externas sin validar.

\n\n

¿Cuándo usar cada uno?

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
EscenarioRecomendación
Almacenamiento en caché interno de PHPserialize() (más rápido para objetos complejos)
API REST o intercambio con otros lenguajesjson_encode()
Base de datos (MySQL, PostgreSQL)json_encode() (más legible y portable)
Archivos de configuraciónjson_encode()
Objetos con propiedades privadas o métodosserialize() (preserva la clase)
Datos de usuario no confiablesjson_encode() (seguridad)
\n\n

Conclusión

\n\n

La elección entre json_encode() y serialize() depende del contexto:

\n\n
    \n
  • Usa JSON para la mayoría de los casos: APIs, bases de datos, archivos de configuración y cualquier escenario donde necesites compatibilidad con otros lenguajes.
  • \n
  • Usa serialize solo para almacenamiento interno de PHP, especialmente cuando trabajes con objetos complejos que necesiten preservar su tipo exacto.
  • \n
\n\n

En términos de rendimiento, JSON es más rápido y eficiente en espacio. En seguridad, JSON es claramente superior. Y en compatibilidad, no hay comparación posible.

\n\n

¿Tienes experiencia con alguno de estos métodos? ¡Comparte tu opinión en los comentarios!

Blogs

Book Recommendations