Introducción: el dilema eterno del desarrollador PHP
\n\nTodo 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.
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\nLa 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\nPHP 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
En apariencia, ambos hacen lo mismo. Pero el diablo, como siempre, está en los detalles.
\n\nEjemplo 1: Array asociativo simple
\n\nEmpecemos 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\nYa 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.
Ejemplo 2: Array multidimensional
\n\nCompliquemos 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\nConclusió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\nRendimiento: ¿cuál es más rápido?
\n\nLa 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\nResultados (en PHP 8.2):
\n- \n
- Serialize: ~1.8 seg \n
- JSON: ~1.2 seg \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\nCompatibilidad: ¿funciona fuera de PHP?
\n\nAquí 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.
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\nSeguridad: un punto crítico
\n\nLa 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.
Por el contrario, json_decode() es mucho más seguro, ya que solo interpreta datos y no ejecuta código.
Regla de oro: Nunca uses unserialize() con datos de entrada del usuario o de fuentes externas sin validar.
¿Cuándo usar cada uno?
\n\n| Escenario | \nRecomendación | \n
|---|---|
| Almacenamiento en caché interno de PHP | \nserialize() (más rápido para objetos complejos) | \n
| API REST o intercambio con otros lenguajes | \njson_encode() | \n
| Base de datos (MySQL, PostgreSQL) | \njson_encode() (más legible y portable) | \n
| Archivos de configuración | \njson_encode() | \n
| Objetos con propiedades privadas o métodos | \nserialize() (preserva la clase) | \n
| Datos de usuario no confiables | \njson_encode() (seguridad) | \n
Conclusión
\n\nLa elección entre json_encode() y serialize() depende del contexto:
- \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
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!