2013-06-17 17 views
7

Il libro CLR Via C# presenta un modo semplice per clonare gli oggetti tramite la serializzazione binaria.Che cosa fa in realtà StreamingContextStates.Clone?

Specifica StreamingContextStates.Clone durante la creazione del BinaryFormatter modo:

var formatter = new BinaryFormatter 
{ 
    Context = new StreamingContext(StreamingContextStates.Clone) 
}; 

The documentation for StreamingContextStates.Clone dice che

Specifica che il grafico oggetto viene clonato. Gli utenti possono presumere che il grafico clonato continuerà ad esistere all'interno dello stesso processo ed essere sicuro di accedere agli handle o ad altri riferimenti a risorse non gestite.

Abbastanza giusti - ma non so davvero cosa significhi in realtà. In che modo questo cambia effettivamente il comportamento dello BinaryFormatter? Qualcuno può elencare eventuali effetti concreti che l'uso di questo flag ha?

+3

Per la cronaca, io ** ** fortemente suggerisco di evitare 'BinaryFormatter' in, beh, la maggior parte delle circostanze. Ha alcune cose in cui è utile, ma ho visto * così tante * persone hanno * così tanto * dolore causato da questo ... anzi, i problemi in 'BinaryFormatter' erano parte del motivo per cui sono stato pesantemente coinvolto nella serializzazione alcuni anni fa –

+3

Questa proprietà viene esposta nuovamente in "ISerializable.GetObjectData (...)", quindi tecnicamente qualsiasi implementazione ** potrebbe in teoria ** scegliere di fare qualcosa di diverso in base al valore di 'StreamingContextStates'. Non so quanti, se ce ne sono, * do *, anche se –

+0

@MarcGravell Interessante, grazie. (E forse quel campione dovrebbe essere tolto da CLR Via C# per la prossima edizione quindi;) –

risposta

2

La serializzazione è l'argomento qui.
MS ha fornito un mini-framework "astratto" per consentire la serializzazione degli oggetti.
Il formattatore binario è un'implementazione specifica di questi concetti di mini-framework.

Uno sviluppatore può scegliere di utilizzare i concetti di framework per creare il proprio formattatore personalizzato - o -
MS durante la creazione del mini-framework pensato per l'ulteriore implementazione della serializzazione.

Quindi hanno fornito queste bandiere come parte del framework.

Per rispondere alla domanda specifica: tali flag non avranno alcun effetto sul formattatore binario in quanto è già implementato come strumento (se lo si desidera) per tracciare il grafico dell'oggetto e convertirlo semplicemente in byte di dati non elaborati.
Se si crea il proprio serializzatore che, ad esempio, può salvare l'oggetto in un database o in un file o in una memoria condivisa o altro, l'utente che utilizza il serializzatore deve specificare l'indicatore corrispondente.

A meno che io totalmente frainteso sviluppatori MS dal 2003 .. :) (che è possibile!)