2010-02-09 14 views
10
//Serialize the Object 
MemoryStream ms = new MemoryStream(); 
IFormatter formatter = new BinaryFormatter(); 
formatter.Serialize(ms , ObjectToSerialize); 
byte[] arrbyte = new byte[ms .Length]; 
ms.Read(arrbyte , 0, (int)ms .Length); 
ms.Close(); 

//Deserialize the Object 
Stream s = new MemoryStream(arrbyte); 
s.Position = 0; 
Object obj = formatter.Deserialize(s);//Throws an Exception 
s.Close(); 

Se provo per deserializzare con il modo in cui sopra dà l'eccezione comedeserializzazione non funziona su MemoryStream

'Flusso binario '0' non contiene una BinaryHeader valida. Le possibili cause sono lo streaming non valido o il cambio di versione dell'oggetto tra la serializzazione e la deserializzazione. '

Dove sottostante Codice funziona

//Serialize the Object 
IFormatter formatter = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(); 
formatter.Serialize(ms, ObjectToSerialize); 
ms.Seek(0, SeekOrigin.Begin); 
byte[] arrbyte = ms.ToArray(); 

//Deserialize the Object 
Stream s= new MemoryStream(byt); 
stream1.Position = 0; 
Object obj = formatter.Deserialize(s); 
stream1.Close(); 

L'unica differenza è il primo approccio utilizza il metodo Read per compilare la matrice di byte in cui il secondo utilizza la Seek & ToArray() per compilare la matrice di byte. Qual è il motivo dell'eccezione.

risposta

16

Il primo modo serializza l'oggetto sul MemoryStream, il quale risulta in MemoryStream posizionato alla fine dei byte scritti. Da lì leggi tutti i byte fino alla fine nell'array di byte: nessuno (perché MemoryStream è già alla fine).

È possibile spostare la posizione all'interno della MemoryStream alla partenza prima di leggere da esso:

ms.Seek(0, SeekOrigin.Begin); 

Ma il codice poi fa esattamente lo stesso del secondo modo: creare un nuovo array di byte di lunghezza ms.Length e copia tutti i byte dallo stream all'array di byte. Allora, perché reinventare la ruota?

Si noti che il secondo modo non richiede che Seek as ToArray copi sempre tutti i byte, indipendentemente dalla posizione di MemoryStream.

+0

Ah bene, stavo fissando quello per un po 'cercando di capirlo :) –

+0

@dtb, Grazie. Ora ho capito il problema – Ragunath

+0

@dtb grazie mille ho passato alcuni giorni su questo argomento T__T –

0

Si dovrebbe cercare all'inizio del flusso nel primo caso, prima di leggere il contenuto del flusso, mentre nel secondo caso la ricerca non è necessaria prima della chiamata ToArray.

Problemi correlati