Domanda

Se hai un'istanza di oggetto A che fa riferimento ad altri oggetti (ad esempio le istanze B e C) e serializzi A in formato binario in un file, cosa succede?Ora disponi di dati serializzati che includono A, B e C?

Come funziona esattamente?Cosa otterrò se deserializzo i dati?A, B e C??

(Sentitevi liberi di includere anche spiegazioni sul funzionamento interno).

È stato utile?

Soluzione

Verranno serializzati anche tutti i riferimenti ad altri oggetti. Se deserializzi i dati, ti ritroverai con un set completo e funzionante dei relativi dati, inclusi gli oggetti A, B e C.Questo è probabilmente il vantaggio principale della serializzazione binaria, rispetto alla serializzazione XML.

Se una qualsiasi delle altre classi a cui il tuo oggetto fa riferimento non è contrassegnata con il simbolo [Serializable] attributo, otterrai un SerializationException in fase di esecuzione (la cui immagine è stata spudoratamente rubata dal web;gli errori di runtime non appaiono più così nelle attuali versioni di VS):

    Example of an unhandled SerializationException

Oltre a ciò, non sono proprio sicuro di quali "cose ​​interne" speravi di capire.Usi di serializzazione riflessione per percorrere i campi pubblici e privati ​​degli oggetti, convertendoli in un flusso di byte, che alla fine vengono scritti in un flusso di dati.Durante la deserializzazione avviene il contrario:dal flusso di dati viene letto un flusso di byte, utilizzato per sintetizzare una replica esatta dell'oggetto, insieme alle informazioni sul tipo.Tutti i campi nell'oggetto hanno gli stessi valori che contenevano prima;il costruttore è non chiamato quando un oggetto viene deserializzato.Il modo più semplice per pensarci è che stai semplicemente prendendo un istantanea sul posto dell'oggetto, che potrai riportare allo stato originale a tuo piacimento.

La classe responsabile dell'effettiva serializzazione e deserializzazione è chiamata formattatore (eredita sempre dal IFormatter interfaccia).Il suo compito è generare un "grafico dell'oggetto", ovvero un albero generalizzato contenente l'oggetto che viene serializzato/deserializzato come radice.Come accennato in precedenza, il formattatore utilizza la riflessione per percorrere questo oggetto grafico, serializzando/deserializzando tutti i riferimenti all'oggetto contenuti da quell'oggetto.Il formattatore è anche sufficientemente intelligente da sapere di non serializzare alcun oggetto nel grafico più di una volta.Se due riferimenti a oggetti puntano effettivamente allo stesso oggetto, questo verrà rilevato e l'oggetto verrà serializzato una sola volta.Questa e altre logiche impediscono di entrare in un ciclo infinito.

Naturalmente, è facile avere una buona comprensione generale di come funziona questo processo.Suo tanto più difficile scrivere effettivamente il codice che lo implementa da solo.Fortunatamente, questo è già stato fatto per te.Parte dello scopo di .NET Framework è che tutta questa complicata logica di serializzazione è incorporata, lasciandoti libero di preoccupartene.Non pretendo di capirlo tutto da solo, e certamente non è necessario neanche tu per sfruttare appieno le funzionalità che offre.Anni trascorsi a scrivere tutto quel codice a mano sono finalmente finiti.Dovresti rallegrarti, piuttosto che preoccuparti dei dettagli di implementazione.:-)

Altri suggerimenti

In primo luogo, il tipo di oggetto A deve essere contrassegnato con l'attributo [Serializable].La serializzazione A serializzerà tutti i dati dei suoi membri, privati o pubblici, a condizione che anche i tipi di membri siano contrassegnati con [Serializable] (o per usare il tuo esempio, a condizione che i tipi B e C siano contrassegnati [Serializable]).I tentativi di serializzare i dati, direttamente o indirettamente, di un tipo che non è [Serializable] risulteranno in un'eccezione.

Alcuni tipi .NET incorporati sono già contrassegnati come [Serializable], inclusi System.Int32 (int), System.Boolean (bool), ecc.

Puoi leggere ulteriori informazioni sulla serializzazione .NET qui: http:// msdn.microsoft.com/en-us/library/4abbf6k0.aspx .

Anche gli oggetti riferiti dall'oggetto principale devono essere [Serializzabili].Fornendo così tutto viene fatto automaticamente dal formattatore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top