2009-08-20 4 views
11

Per quanto ho capito, l'interfaccia IDeserializationCallback e l'evento OnDeserialized possono essere entrambi utilizzati quando un oggetto deve eseguire alcune attività dopo essere stato deserializzato.IDeserializationCallback vs OnDeserializedAttribute

IDeserializationCallback:

[Serializable] 
public class Foo : IDeserializationCallback 
{ 
    public void OnDeserialization(object sender) 
    { 
     // initialize unserialized fields etc. 
    } 
} 

evento OnDeserialized:

[Serializable] 
public class Foo 
{ 
    [OnDeserialized] 
    public void OnDeserialized(StreamingContext context) 
    { 
     // initialize unserialized fields etc. 
    } 
} 

Esistono specifici vantaggi/svantaggi o scenari in cui si desidera scegliere uno sopra l'altro?

risposta

2

Mi sono chiesto la stessa cosa. Per quanto riguarda i pro/contro, posso solo pensare che l'interfaccia abbia un vantaggio in quanto ti costringe ad implementare la firma del metodo corretta dove-come la versione dell'attributo ti permetterà di compilare la tua classe senza badare a quale sia la firma del tuo metodo .

+0

Buon punto. Questo è un vantaggio piuttosto interessante dell'utilizzo dell'interfaccia IDeserializationCallback. –

+2

In realtà questa non è la risposta giusta - guarda la risposta di Val e segui il link lì. –

5
post di

Darren Headrick dall'alto di collegamento (per completezza): "Viene eseguito quando l'intero grafo oggetto è stato deserializzati"

DeserializationCallback.OnDeserialization (link).

L'evento OnDeserialized comunque "Usa l'OnDeserializedAttribute quando è necessario fissare i valori su un oggetto deserializzato dopo che è stato deserializzato e prima che il grafico viene restituito. Questo attributo può essere usato al posto dell'interfaccia IDeserializationCallback." (link).

Poiché l'attributo OnDeserialized può essere utilizzato per modificare il grafico dell'oggetto, viene chiamato prima di OnDeserialization (che indica che il grafico dell'oggetto si trova nel suo stato finale).

2

Ulteriori discussione su questo blog post