JSON o serialize: la eterna pregunta del desarrollador PHP
\n\nImagina: 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.
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\nAmbas 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
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\nSe 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\nComparación por criterios clave
\n\nVamos a desglosarlo todo. Realicé pruebas y recopilé datos que te ayudarán a tomar una decisión.
\n\n1. Rendimiento: ¿cuál es más rápido?
\n\nMuchos 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\nConclusió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.
2. Tamaño de datos: ¿cuál es más compacto?
\n\nJSON 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
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\n3. Seguridad: la amenaza oculta de serialize
\n\nAquí es donde muchos caen. unserialize() puede ejecutar código arbitrario si se le pasan datos manipulados. Esto se llama PHP object injection.
<?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\nImportante: Nunca uses unserialize() con datos provenientes del usuario. JSON en este aspecto es absol