Il problema che ho è: non tutte le variabili (siano esse primitive come int o oggetti compositi) sono già rappresentate da una sequenza di byte?
Sì. Il problema qui è il layout di quei byte. Un sempliceint
può essere lungo 2, 4 o 8 bit. Può essere in endian grande o piccolo. Può essere senza segno, firmato con il complemento di 1 o anche in alcuni bit super esotici come il negabinary.
Se int
scarichi semplicemente il binario dalla memoria e lo chiami "serializzato", devi collegare praticamente tutto il computer, il sistema operativo e il programma affinché sia deserializzabile. O almeno una descrizione precisa di essi.
Quindi cosa rende la serializzazione un argomento così profondo? Per serializzare una variabile, non possiamo semplicemente prendere questi byte in memoria e scriverli in un file? Quali difficoltà ho perso?
La serializzazione di un oggetto semplice sta praticamente scrivendo secondo alcune regole. Tali regole sono molte e non sempre ovvie. Ad esempio un xs:integer
in XML è scritto in base-10. Non base-16, non base-9, ma 10. Non è un presupposto nascosto, è una regola reale. E tali regole rendono la serializzazione una serializzazione. Perché, praticamente, non ci sono regole sulla disposizione dei bit del tuo programma in memoria .
Era solo la punta di un iceberg. Facciamo un esempio di una sequenza di quei primitivi più semplici: una C struct
. Potresti pensarlo
struct {
short width;
short height;
long count;
}
ha un layout di memoria definito su un determinato computer + sistema operativo? Beh, non lo fa. A seconda delle #pragma pack
impostazioni correnti , il compilatore riempie i campi. Con le impostazioni predefinite della compilazione a 32 bit, entrambi shorts
saranno riempiti a 4 byte, quindi struct
in realtà avranno 3 campi di 4 byte in memoria. Quindi ora, non devi solo specificare che short
è lungo 16 bit, è un numero intero, scritto nel complemento 1 negativo, big o little endian. È inoltre necessario annotare le impostazioni di imballaggio della struttura con cui è stato compilato il programma.
Questo è praticamente ciò che riguarda la serializzazione: creare un insieme di regole e attenersi a esse.
Tali regole possono quindi essere espanse per accettare strutture ancora più sofisticate (come elenchi a lunghezza variabile o dati non lineari), funzionalità aggiuntive come leggibilità umana, controllo delle versioni, compatibilità con le versioni precedenti e correzione degli errori, ecc. Ma anche scrivere un singolo int
è già abbastanza complicato se si voglio solo assicurarti che sarai in grado di rileggerlo in modo affidabile.