Domanda

Qual è la differenza tra l'utilizzo dell'attributo Serializable e implementando l'interfaccia ISerializable?

È stato utile?

Soluzione

Quando si utilizza il riferimento SerializableAttribute di attributo si sta mettendo un attributo su un campo a tempo di compilazione in modo tale che, quando in fase di esecuzione, le strutture serializzazione sapranno cosa serializzare in base agli attributi eseguendo riflessione sulla / modulo / montaggio tipo di classe .

[Serializable]
public class MyFoo { … }

È possibile che questo indica che l'impianto di serializzazione devono serializzare l'intero MyFoo di classe, considerando quanto segue:

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

Utilizzando l'attributo è possibile scegliere in modo selettivo quali campi deve essere serializzato.

Quando si implementa il ISerializable interfaccia , la serializzazione in modo efficace viene sovrascritto con una versione personalizzata, sovrascrivendo GetObjectData e SetObjectData (e fornendo un costruttore della forma MyFoo(SerializationInfo info, StreamingContext context)), ci sarebbe stato un grado più fine di controllo sulla serializzazione dei dati.

questo esempio di serializzazione personalizzata qui su StackOverflow . Essa mostra come mantenere i retro-compatibili con serializzazione diversi versionings dei dati serializzati.

Spero che questo aiuti.

Altri suggerimenti

Il SerializableAttribute indica al framework di fare la serializzazione di default processi. Se avete bisogno di un maggiore controllo, è possibile implementare la ISerializable interfacciarsi . Poi si dovrebbe mettere il proprio codice per serializzare l'oggetto nel metodo GetObjectData e aggiornare l'oggetto SerializationInfo che viene passato ad esso.

L'interfaccia ISerializable consente di implementare personalizzato serializzazione diverso da quello predefinito. Quando si implementa l'interfaccia ISerializable, è necessario eseguire l'override metodo GetObjectData come segue

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}

ISerialize forza di implementare la logica di serializzazione manially, mentre la marcatura per attributo Serializable (volevi dire vero?) Vi dirà serializzatore binario che questa classe può essere serializzato. E lo farà automaticamente.

eredita da ISerializable consente di implementare personalizzato la (de) serializzazione. Quando si utilizza solo l'attributo Serializable, il (de) serializzazione può essere controllato solo per attributi ed è meno flessibile.

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