La serializzazione è il processo di conversione di un oggetto o una struttura di dati in un formato sequenziale adatto alla trasmissione in rete o al salvataggio in un file. Il processo inverso, la deserializzazione, ripristina i dati allo stato originale. Secondo MDN Web Docs, la serializzazione è necessaria per qualsiasi comunicazione tra processi. La serializzazione è alla base delle API REST, della memorizzazione nella cache e dello scambio di dati tra i componenti dell’applicazione.
Punti chiave
La serializzazione è il processo di conversione di un oggetto residente nella RAM in una sequenza lineare di byte o caratteri che può essere trasmessa in rete, salvata in un file o passata a un altro processo. Senza serializzazione, la comunicazione di rete, la persistenza dello stato e l’interazione tra processi sarebbero impossibili.
La serializzazione coinvolge due processi opposti. Il processo diretto (serializzazione) impacchetta i dati in un formato di trasmissione. Il processo inverso (deserializzazione) ripristina i dati nell’oggetto. La deserializzazione è critica per la sicurezza: dati di input errati possono portare a vulnerabilità nell’applicazione.
Nello sviluppo di applicazioni mobili, la serializzazione viene utilizzata ovunque: invio di richieste al server ed elaborazione delle risposte, salvataggio dello stato dell’applicazione durante la rotazione dello schermo, memorizzazione nella cache su disco e trasferimento di dati tra schermate tramite Intent (Android) o Segue (iOS).
I formati di serializzazione si dividono in testuali e binari. I formati testuali (JSON, XML) sono leggibili dall’uomo e non richiedono strumenti per la visualizzazione. I formati binari (Protobuf, FlatBuffers, MessagePack) sono più compatti e veloci, ma illeggibili senza deserializzazione. La scelta del formato è un compromesso tra prestazioni e comodità di debug.
Oltre a JSON, XML e Protobuf, esistono formati specializzati: FlatBuffers di Google per giochi e AR, MessagePack — un’alternativa binaria compatta a JSON, Avro di Apache per big data in Kafka, YAML — un formato di configurazione con supporto ai commenti.
| Formato | Tipo | Schema | Dimensione | Velocità |
|---|---|---|---|---|
| JSON | Testo | Opzionale | Media | Media |
| XML | Testo | XSD | Grande | Bassa |
| Protobuf | Binario | Obbligatorio | Piccola | Alta |
| FlatBuffers | Binario | Obbligatorio | Piccola | Massima |
| MessagePack | Binario | No | Piccola | Alta |
| Avro | Binario | JSON Schema | Piccola | Alta |
La serializzazione sulle piattaforme mobili ha le sue peculiarità: traffico limitato, processori meno potenti e la necessità di preservare lo stato durante le rotazioni dello schermo. Su Android si utilizzano Gson, Moshi, Kotlinx Serialization. Su iOS — Codable, JSONSerialization, PropertyListEncoder. La scelta corretta della libreria influisce criticamente sulle prestazioni dell’applicazione.
Kotlinx Serialization è una libreria moderna di JetBrains per Kotlin Multiplatform Mobile. Supporta JSON, Protobuf, CBOR e formati personalizzati. La generazione del codice avviene in fase di compilazione tramite il plugin Kotlin Serialization, garantendo alte prestazioni senza utilizzare la riflessione.
La libreria Kotlinx Serialization utilizza l’annotazione @Serializable per le classi e un plugin del compilatore per generare serializzatori. Ciò garantisce elevate prestazioni e sicurezza dei tipi. Il formato predefinito è JSON, ma altri formati sono supportati tramite moduli aggiuntivi.
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)
// Serializzazione
val jsonString = json.encodeToString(project)
// Deserializzazione
val restored = json.decodeFromString<Project>(jsonString)
}
Il protocollo Codable è il meccanismo di serializzazione integrato di Swift. Combina i protocolli Encodable (serializzazione) e Decodable (deserializzazione). JSONEncoder e JSONDecoder gestiscono automaticamente strutture annidate, array, valori opzionali e chiavi personalizzate tramite 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)
Le prestazioni dei formati di serializzazione vengono valutate secondo tre metriche: dimensione del messaggio, velocità di serializzazione e velocità di deserializzazione. Per le applicazioni mobili, tutte e tre sono critiche: la dimensione influisce sul traffico e sul tempo di caricamento, la velocità influisce sulla reattività dell’interfaccia e sul tempo di avvio dell’applicazione.
Protobuf e FlatBuffers mostrano i migliori risultati grazie alla rappresentazione binaria. FlatBuffers si distingue perché non richiede un passaggio separato di deserializzazione — i dati vengono letti direttamente dal buffer binario, rendendolo ideale per giochi e applicazioni AR con requisiti di latenza minima. JSON rimane il formato più popolare per le API REST, nonostante le prestazioni inferiori, grazie alla sua semplicità e universalità.
| Scenario | Formato consigliato | Motivo |
|---|---|---|
| API REST | JSON | Universalità, leggibilità, supporto |
| Microservizi | Protobuf | Compattezza, velocità, gRPC |
| Giochi / AR | FlatBuffers | Zero-copy, latenza minima |
| Big Data | Avro | Compatibilità con Kafka e Hadoop |
| Configurazione | YAML | Commenti, leggibilità |
| Layout Android | XML | Standard di piattaforma |
Test pratici su un set di dati di 1000 oggetti utente mostrano: Protobuf crea messaggi di 12 KB (JSON — 85 KB, XML — 120 KB). Tempo di serializzazione: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Questi numeri rendono i formati binari preferibili per i sistemi ad alto carico e le applicazioni mobili con traffico limitato.
Gli esempi mostrano la serializzazione dello stesso oggetto in diversi formati. Ciò aiuta a confrontare visivamente dimensione e leggibilità. Lo stesso oggetto User verrà serializzato in JSON, XML e Protobuf — è chiaramente visibile che JSON è più compatto di XML e Protobuf è il più compatto di tutti e illeggibile.
JSON — sintassi minimalista, chiavi tra virgolette, valori di diversi tipi. Occupa 80 caratteri. Leggibilità alta, struttura visiva chiara. Adatto per API dove contano la velocità di sviluppo e debug.
XML — ogni elemento è racchiuso in tag di apertura e chiusura. Occupa 150 caratteri. Leggibilità media, struttura rigorosa. Adatto per flussi documentali e sistemi che richiedono validazione XSD.
Protobuf — binario, 32 byte per questi dati. Illeggibile — richiede deserializzazione per la visualizzazione. La dimensione minima lo rende ideale per sistemi ad alto carico e applicazioni mobili.
{
"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>
Le best practice aiutano a evitare errori comuni e a scegliere la strategia di serializzazione giusta per il progetto. Seguire queste raccomandazioni migliora le prestazioni, la sicurezza e la manutenibilità del codice.
La sicurezza della serializzazione è un aspetto criticamente importante, specialmente quando si deserializzano dati da fonti non affidabili. Gli attacchi di deserializzazione possono portare all’esecuzione remota di codice (RCE), una delle vulnerabilità più pericolose nelle applicazioni web e mobili. I casi più noti sono legati a Java Serializable e Python pickle.
Protobuf e JSON hanno una protezione integrata contro tali attacchi, poiché lavorano solo con dati, non con oggetti arbitrari. Java Serializable, al contrario, può ripristinare qualsiasi classe disponibile nel classpath, rendendolo pericoloso per ricevere dati da fonti esterne. Su Android, si consiglia di utilizzare Kotlinx Serialization o Moshi invece della serializzazione Java standard.
Misure di sicurezza aggiuntive: imposta un limite sulla dimensione dei dati di input, valida lo schema prima della deserializzazione, non fidarti del Content-Type dalle intestazioni HTTP, usa una whitelist per le classi consentite. Aggiorna regolarmente le librerie di serializzazione, poiché le vulnerabilità vengono periodicamente scoperte e corrette.
Domande frequenti
La serializzazione converte un oggetto in una sequenza di byte, mentre il marshalling trasferisce dati tra diversi spazi di indirizzi preservando tipi e struttura. Il marshalling include la serializzazione come parte del processo, ma può anche includere la codifica dei riferimenti e la gestione della memoria.
I FlatBuffers di Google offrono la massima velocità grazie alla deserializzazione zero-copy — i dati vengono letti direttamente dal buffer binario senza trasformazione. Protobuf è al secondo posto, JSON al terzo. XML è il formato più lento tra quelli comuni.
Kotlinx Serialization è la scelta migliore per i nuovi progetti Kotlin: generazione in compilazione, supporto Kotlin Multiplatform, null safety. Moshi è una buona scelta per progetti Java, più performante di Gson. Gson è la libreria più semplice per iniziare, ma è più lenta e usa la riflessione.
I riferimenti circolari portano a ricorsione infinita durante la serializzazione. Soluzioni: usa riferimenti ID invece di riferimenti diretti agli oggetti, applica adapter di serializzazione specializzati (es. @JsonIgnore in Jackson), o riprogetta il modello dati per eliminare i cicli.
Sì, specialmente la deserializzazione di dati non affidabili. Le vulnerabilità di deserializzazione possono portare all’esecuzione remota di codice. Raccomandazioni: non deserializzare dati da fonti non affidabili, usa una whitelist di classi durante la deserializzazione e valida lo schema dei dati prima dell’elaborazione.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche