Qual è la differenza tra l'utilizzo dell'attributo Serializable e attuazione ISerializable?
-
23-09-2019 - |
Domanda
Qual è la differenza tra l'utilizzo dell'attributo Serializable
e implementando l'interfaccia ISerializable
?
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 (e fornendo un costruttore della forma SetObjectData
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.