La serialización es el proceso de convertir un objeto o estructura de datos en un formato secuencial adecuado para la transmisión por red o el almacenamiento en archivo. El proceso inverso, la deserialización, restaura los datos a su estado original. Según MDN Web Docs, la serialización es necesaria para cualquier comunicación entre procesos. La serialización es la base de las API REST, el almacenamiento en caché y el intercambio de datos entre componentes de la aplicación.
Puntos clave
Serialización es el proceso de convertir un objeto que se encuentra en la memoria RAM en una secuencia lineal de bytes o caracteres que se puede transmitir por la red, guardar en un archivo o pasar a otro proceso. Sin serialización, la comunicación en red, la persistencia del estado y la interacción entre procesos serían imposibles.
La serialización incluye dos procesos opuestos. El proceso directo (serialización) empaqueta los datos en un formato de transmisión. El proceso inverso (deserialización) restaura los datos al objeto original. La deserialización es crítica para la seguridad: los datos de entrada incorrectos pueden provocar vulnerabilidades en la aplicación.
En el desarrollo de aplicaciones móviles, la serialización se utiliza en todas partes: envío de solicitudes al servidor y procesamiento de respuestas, guardado del estado de la aplicación al rotar la pantalla, almacenamiento en caché de datos en el disco y transferencia de datos entre pantallas mediante Intent (Android) o Segue (iOS).
Los formatos de serialización se dividen en textuales y binarios. Los formatos textuales (JSON, XML) son legibles por humanos y no requieren herramientas para su visualización. Los formatos binarios (Protobuf, FlatBuffers, MessagePack) son más compactos y rápidos, pero ilegibles sin deserialización. La elección del formato es un compromiso entre rendimiento y comodidad de depuración.
Además de JSON, XML y Protobuf, existen formatos especializados: FlatBuffers de Google para juegos y RA, MessagePack — un análogo binario compacto de JSON, Avro de Apache para big data en Kafka, YAML — un formato de configuración con soporte de comentarios.
| Formato | Tipo | Esquema | Tamaño | Velocidad |
|---|---|---|---|---|
| JSON | Texto | Opcional | Mediano | Media |
| XML | Texto | XSD | Grande | Baja |
| Protobuf | Binario | Obligatorio | Pequeño | Alta |
| FlatBuffers | Binario | Obligatorio | Pequeño | Máxima |
| MessagePack | Binario | No | Pequeño | Alta |
| Avro | Binario | JSON Schema | Pequeño | Alta |
La serialización en plataformas móviles tiene sus particularidades: tráfico limitado, procesadores más débiles y la necesidad de conservar el estado durante las rotaciones de pantalla. En Android se utilizan Gson, Moshi, Kotlinx Serialization. En iOS — Codable, JSONSerialization, PropertyListEncoder. La elección correcta de la biblioteca afecta críticamente al rendimiento de la aplicación.
Kotlinx Serialization es una biblioteca moderna de JetBrains para Kotlin Multiplatform Mobile. Soporta JSON, Protobuf, CBOR y formatos personalizados. La generación de código ocurre en tiempo de compilación mediante el plugin Kotlin Serialization, lo que garantiza un alto rendimiento sin usar reflexión.
La biblioteca Kotlinx Serialization utiliza la anotación @Serializable para las clases y un plugin de compilador para generar serializadores. Esto garantiza un alto rendimiento y seguridad de tipos. El formato predeterminado es JSON, pero se soportan otros formatos mediante módulos adicionales.
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString
import kotlinx.serialization.decodeFromString
@Serializable
data class Project(
val id: Int,
val name: String,
val platforms: List<String>,
val active: Boolean
)
val json = Json {
prettyPrint = true
ignoreUnknownKeys = true
encodeDefaults = true
}
fun main() {
val project = Project(1, "MobileApp",
listOf("Android", "iOS"), true)
// Serialización
val jsonString = json.encodeToString(project)
// Deserialización
val restored = json.decodeFromString<Project>(jsonString)
}
El protocolo Codable es el mecanismo de serialización integrado en Swift. Combina los protocolos Encodable (serialización) y Decodable (deserialización). JSONEncoder y JSONDecoder manejan automáticamente estructuras anidadas, arrays, valores opcionales y claves personalizadas mediante CodingKeys.
import Foundation
struct AppConfig: Codable {
let appName: String
let version: String
let features: [String]
let isProduction: Bool
}
let config = AppConfig(
appName: "MyApp",
version: "2.1.0",
features: ["push", "analytics", "offline"],
isProduction: true
)
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
guard let data = try? encoder.encode(config) else { return }
let jsonString = String(data: data, encoding: .utf8)
El rendimiento de los formatos de serialización se evalúa mediante tres métricas: tamaño del mensaje, velocidad de serialización y velocidad de deserialización. Para aplicaciones móviles, las tres son críticas: el tamaño afecta el tráfico y el tiempo de carga, la velocidad afecta la capacidad de respuesta de la interfaz y el tiempo de inicio de la aplicación.
Protobuf y FlatBuffers muestran los mejores resultados gracias a la representación binaria. FlatBuffers destaca porque no requiere un paso separado de deserialización — los datos se leen directamente del búfer binario, lo que lo hace ideal para juegos y aplicaciones de RA con requisitos de latencia mínima. JSON sigue siendo el formato más popular para API REST, a pesar de su peor rendimiento, debido a su simplicidad y universalidad.
| Escenario | Formato recomendado | Motivo |
|---|---|---|
| API REST | JSON | Universalidad, legibilidad, soporte |
| Microservicios | Protobuf | Compacidad, velocidad, gRPC |
| Juegos / RA | FlatBuffers | Zero-copy, latencia mínima |
| Big Data | Avro | Compatibilidad con Kafka y Hadoop |
| Configuración | YAML | Comentarios, legibilidad |
| Layouts Android | XML | Estándar de plataforma |
Las pruebas prácticas con un conjunto de 1000 objetos de usuario muestran: Protobuf crea mensajes de 12 KB (JSON — 85 KB, XML — 120 KB). Tiempo de serialización: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Estas cifras hacen que los formatos binarios sean preferibles para sistemas de alta carga y aplicaciones móviles con tráfico limitado.
Los ejemplos muestran la serialización de un mismo objeto en diferentes formatos. Esto ayuda a comparar visualmente el tamaño y la legibilidad. El mismo objeto User se serializará en JSON, XML y Protobuf — se ve claramente que JSON es más compacto que XML, y Protobuf es el más compacto de todos, aunque ilegible.
JSON — sintaxis minimalista, claves entre comillas, valores de diferentes tipos. Ocupa 80 caracteres. La legibilidad es alta, la estructura visual es clara. Adecuado para API donde importa la velocidad de desarrollo y depuración.
XML — cada elemento está envuelto en etiquetas de apertura y cierre. Ocupa 150 caracteres. Legibilidad moderada, estructura estricta. Adecuado para flujos de documentos y sistemas que requieren validación XSD.
Protobuf — binario, 32 bytes para estos datos. Ilegible — requiere deserialización para visualizarse. El tamaño mínimo lo hace ideal para sistemas de alta carga y aplicaciones móviles.
{
"id": 42,
"name": "IT Sectr",
"email": "team@itsectr.com",
"role": "admin",
"active": true
}
<user>
<id>42</id>
<name>IT Sectr</name>
<email>team@itsectr.com</email>
<role>admin</role>
<active>true</active>
</user>
Las mejores prácticas ayudan a evitar errores típicos y elegir la estrategia de serialización adecuada para el proyecto. Seguir estas recomendaciones mejora el rendimiento, la seguridad y el mantenimiento del código.
La seguridad de la serialización es un aspecto crítico, especialmente al deserializar datos de fuentes no confiables. Los ataques de deserialización pueden provocar la ejecución remota de código (RCE), lo que la convierte en una de las vulnerabilidades más peligrosas en aplicaciones web y móviles. Los casos más conocidos están relacionados con Java Serializable y Python pickle.
Protobuf y JSON tienen protección integrada contra tales ataques, ya que trabajan solo con datos, no con objetos arbitrarios. Java Serializable, por el contrario, puede restaurar cualquier clase disponible en el classpath, lo que lo hace peligroso para recibir datos de fuentes externas. En Android, se recomienda usar Kotlinx Serialization o Moshi en lugar de la serialización Java estándar.
Medidas de seguridad adicionales: establece un límite en el tamaño de los datos de entrada, valida el esquema antes de la deserialización, no confíes en Content-Type de los encabezados HTTP, usa una lista blanca para las clases permitidas. Actualiza regularmente las bibliotecas de serialización, ya que periódicamente se descubren y corrigen vulnerabilidades.
Preguntas frecuentes
La serialización convierte un objeto en una secuencia de bytes, mientras que el marshalling transfiere datos entre diferentes espacios de direcciones conservando tipos y estructura. El marshalling incluye la serialización como parte del proceso, pero también puede incluir codificación de referencias y gestión de memoria.
Los FlatBuffers de Google proporcionan la máxima velocidad gracias a la deserialización zero-copy — los datos se leen directamente del búfer binario sin transformación. Protobuf ocupa el segundo lugar, JSON el tercero. XML es el formato más lento de los comunes.
Kotlinx Serialization es la mejor opción para proyectos nuevos en Kotlin: generación en compilación, soporte Kotlin Multiplatform, null safety. Moshi es una buena opción para proyectos en Java, más eficiente que Gson. Gson es la biblioteca más simple para empezar, pero es más lenta y usa reflexión.
Las referencias circulares provocan una recursión infinita durante la serialización. Soluciones: usa referencias por ID en lugar de referencias directas a objetos, aplica adaptadores de serialización especializados (por ejemplo, @JsonIgnore en Jackson), o rediseña el modelo de datos para eliminar ciclos.
Sí, especialmente la deserialización de datos no confiables. Las vulnerabilidades de deserialización pueden provocar la ejecución remota de código. Recomendaciones: no deserialices datos de fuentes no confiables, usa una lista blanca de clases durante la deserialización y valida el esquema de datos antes del procesamiento.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también