Che cos'è [serializzabile] e quando dovrei usarlo?


Risposte:


368

Che cos'è?

Quando si crea un oggetto in un'applicazione framework .Net, non è necessario pensare a come i dati vengono archiviati in memoria. Perché .Net Framework si occupa di questo per te. Tuttavia, se si desidera archiviare il contenuto di un oggetto in un file, inviare un oggetto a un altro processo o trasmetterlo attraverso la rete, è necessario pensare a come viene rappresentato l'oggetto perché sarà necessario convertirlo in un formato diverso . Questa conversione si chiama SERIALIZZAZIONE.

Utilizza per la serializzazione

La serializzazione consente allo sviluppatore di salvare lo stato di un oggetto e ricrearlo secondo necessità, fornendo la memorizzazione degli oggetti e lo scambio di dati. Tramite la serializzazione, uno sviluppatore può eseguire azioni come l'invio di un oggetto a un'applicazione remota tramite un servizio Web, il passaggio di un oggetto da un dominio a un altro, il passaggio di un oggetto attraverso un firewall come stringa XML o il mantenimento di sicurezza o specifici dell'utente informazioni tra le applicazioni.

Applica SerializableAttributea un tipo per indicare che è possibile serializzare istanze di questo tipo. Applicare SerializableAttributeanche se la classe implementa anche l' ISerializableinterfaccia per controllare il processo di serializzazione.

Tutti i campi pubblici e privati ​​in un tipo contrassegnato da SerializableAttributesono serializzati per impostazione predefinita, a meno che il tipo non implementi l' ISerializableinterfaccia per sovrascrivere il processo di serializzazione. Il processo di serializzazione predefinito esclude i campi contrassegnati con NonSerializedAttribute. Se un campo di un tipo serializzabile contiene un puntatore, un handle o qualche altra struttura di dati specifica per un determinato ambiente e che non può essere ricostituita in modo significativo in un ambiente diverso, è possibile che si desideri applicare NonSerializedAttributea quel campo.

Vedi MSDN per maggiori dettagli.

Modifica 1

Qualsiasi motivo per non contrassegnare qualcosa come serializzabile

Quando si trasferiscono o si salvano dati, è necessario inviare o salvare solo i dati richiesti. Quindi ci saranno meno ritardi di trasferimento e problemi di archiviazione. Pertanto, durante la serializzazione è possibile escludere inutili blocchi di dati.


1
@dwbartz Link alla tua domanda qui link
jayasurya_j

2
Bella spiegazione, sarebbe bello aggiungere questo all'attributo in MSDN =)
Martea

@jayasurya_j Peccato che la risposta accettata non parli molto delle parti intime
Alexander

1
Buona spiegazione
Zakir HC

42

Alcuni usi pratici per l' [Serializable]attributo:

  • Salvataggio dello stato dell'oggetto mediante serializzazione binaria; puoi facilmente 'salvare' intere istanze di oggetti nella tua applicazione in un flusso di file o di rete e poi ricrearle deserializzando - controlla la BinaryFormatterclasse in System.Runtime.Serialization.Formatters.Binary
  • Scrivere classi le cui istanze di oggetto possono essere memorizzate negli appunti usando Clipboard.SetData()- le classi non serializzabili non possono essere inserite negli appunti.
  • Scrivere classi compatibili con .NET Remoting; generalmente, qualsiasi istanza di classe che passi tra domini di applicazione (eccetto quelli che si estendono da MarshalByRefObject) deve essere serializzabile.

Questi sono i casi di utilizzo più comuni che ho riscontrato.


42

Poiché la domanda originale riguardava SerializableAttribute, è necessario notare che questo attributo si applica solo quando si utilizza BinaryFormatter o SoapFormatter.

È un po 'confuso, a meno che tu non presti davvero attenzione ai dettagli, su quando usarlo e qual è il suo scopo reale.

Non ha nulla a che fare con la serializzazione XML o JSON.

Utilizzati con SerializableAttribute sono l'interfaccia ISerializable e la classe SerializationInfo. Questi sono anche usati solo con BinaryFormatter o SoapFormatter.

A meno che tu non intenda serializzare la tua classe utilizzando Binary o Soap, non preoccuparti di contrassegnare la tua classe come [Serializable]. I serializzatori XML e JSON non sono nemmeno consapevoli della sua esistenza.


16
"Nulla ha a che fare con la serializzazione XML o JSON" - GRAZIE! Finalmente una spiegazione del perché posso serializzare felicemente qualsiasi classe in XML con o senza questo attributo
userSteve

1
Hai una fonte per questo?
Michiel van Oosterhout,

"I serializzatori XML e JSON non sono nemmeno consapevoli della sua esistenza". Non lo so. Quando I JSON ha formattato una classe tramite WCF, i nomi delle proprietà sono usciti con un carattere di sottolineatura precedente se la classe era Serializablee senza quando l'attributo è stato rimosso. Quindi alcune interferenze sono possibili.
Jens,

@Jens se ho capito bene JSON.net non se ne preoccupa un po 'ma asp.net cambia un po' questo comportamento. Credo che tu possa eludere questo con gli attributi JsonObject / JsonProperty.
Base

29

La serializzazione è il processo di conversione di un oggetto in un flusso di byte per archiviare l'oggetto o trasmetterlo alla memoria, a un database o a un file.

Come funziona la serializzazione

Questa illustrazione mostra l'intero processo di serializzazione.

inserisci qui la descrizione dell'immagine

L'oggetto è serializzato su un flusso, che trasporta non solo i dati, ma le informazioni sul tipo di oggetto, come la sua versione, cultura e nome dell'assembly. Da quel flusso, può essere archiviato in un database, un file o memoria.

Dettagli in msdn.



14

serializzazione

La serializzazione è il processo di conversione di un oggetto o di un insieme di oggetti grafico in un flusso, è un array di byte nel caso della serializzazione binaria

Usi di serializzazione

  1. Per salvare lo stato di un oggetto in un file, database ecc. E utilizzarlo in seguito.
  2. Per inviare un oggetto da un processo a un altro (Dominio app) sullo stesso computer e inviarlo anche via cavo a un processo in esecuzione su un altro computer.
  3. Per creare un clone dell'oggetto originale come backup mentre si lavora sull'oggetto principale.
  4. Una serie di oggetti può essere facilmente copiata negli Appunti del sistema e incollata nella stessa o in un'altra applicazione

Di seguito sono riportati alcuni utili attributi personalizzati che vengono utilizzati durante la serializzazione di un oggetto

[Serializzabile] -> Viene utilizzato quando contrassegniamo la serializzazione di un oggetto [Non serializzato ] -> Viene utilizzato quando non si desidera serializzare il campo di un oggetto. [OnSerializing] -> Viene utilizzato quando si desidera eseguire alcune azioni durante la serializzazione di un oggetto [OnSerialized] -> Viene utilizzato quando si desidera eseguire alcune azioni dopo aver serializzato un oggetto in streaming.

Di seguito è riportato l'esempio di serializzazione

[Serializable]
    internal class DemoForSerializable
    {
        internal string Fname = string.Empty;
        internal string Lname = string.Empty;

        internal Stream SerializeToMS(DemoForSerializable demo)
        {
            DemoForSerializable objSer = new DemoForSerializable();
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, objSer);
            return ms;
        }

        [OnSerializing]
        private void OnSerializing(StreamingContext context) {
            Fname = "sheo";
            Lname = "Dayal";
        }
        [OnSerialized]
        private void OnSerialized(StreamingContext context)
        {
       // Do some work after serialized object
        }

    }

Ecco il codice chiamante

class Program
    {
        string fname = string.Empty;
        string Lname = string.Empty; 

       static void Main(string[] args)
        {
            DemoForSerializable demo = new DemoForSerializable();

            Stream ms = demo.SerializeToMS(demo);
            ms.Position = 0;

            DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;

            Console.WriteLine(demo1.Fname);
            Console.WriteLine(demo1.Lname);
            Console.ReadLine();
        }

    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.