2011-10-11 11 views
6

Stavo guardando di recente la serializzazione di runtime e ho trovato l'interfaccia ISerializationSurrogate. Sono confuso circa il suo metodo SetObject tuttavia.Perché ISerializationSurrogate.SetObject restituisce un oggetto e accetta la compilazione di un oggetto?

La firma è:

object SetObjectData(object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.ISurrogateSelector selector)

e le informazioni della guida è:

Sommario:

popola l'oggetto utilizzando le informazioni contenute nella System.Runtime.Serialization .SerializationInfo.

Parametri:

obj: l'oggetto per popolare.

informazioni: Le informazioni per popolare l'oggetto.

contesto: La sorgente da cui l'oggetto è deserializzato.

selettore: Il selettore surrogato in cui inizia la ricerca di un surrogato compatibile.

Returns:

L'oggetto deserializzato popolate.

Se obj è l'oggetto da popolare, perché restituisce The populated deserialized object? In uno example da MSDN vengono inseriti i valori obj e return null.

+0

La mia ipotesi è che ti dà la possibilità di creare una nuova istanza e restituirla invece di riempire quella esistente (se ci sono alcuni setter mancanti ad esempio), ma dovrai testarla ... – Seb

+1

Sembrerebbe che se restituite null, 'SurrogateSelector' restituisce il parametro' obj', ma se restituite un oggetto, è quell'oggetto che viene passato indietro. Sembra un modo strano di fare le cose se me lo chiedi. –

risposta

6

Controllare questo articolo .NET colonna: http://msdn.microsoft.com/en-us/magazine/cc188950.aspx

Dice:

Si noti che il metodo SetObjectData ha un tipo di ritorno di oggetto. Questo ti farebbe pensare che SetObjectData potrebbe effettivamente restituire un riferimento a un tipo di oggetto completamente diverso. Tuttavia, i tipi Microsoft SoapFormatter e BinaryFormatter ignorano completamente questo valore restituito, motivo per cui ho restituito null nell'esempio precedente. Ovviamente, c'è un bug qui; il valore restituito dovrebbe consentire a SetObjectData di restituire un oggetto diverso.

Microsoft ha programmato questo bug per la riparazione. Se il valore restituito è nullo, il formattatore utilizzerà l'oggetto passato a SetObjectData. Se SetObjectData restituisce un riferimento a un oggetto, il formattatore utilizzerà l'oggetto restituito. Sfortunatamente, finché non viene corretto questo errore, non puoi deserializzare un tipo di valore.

Problemi correlati