2010-02-09 12 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(); 

Si trato de deserializar con la forma anterior se da la excepción, ya queDeserialización que no trabaja en MemoryStream

'Secuencia binaria '0' no contiene una BinaryHeader válida. Las posibles causas son la transmisión no válida o la modificación de la versión del objeto entre la serialización y la deserialización.

Cuando a continuación el código está trabajando

//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(); 

La única diferencia es el primer enfoque utiliza el método Read para poblar la matriz de bytes en tanto que la segunda utiliza el Seek & ToArray() para rellenar la matriz de bytes. ¿Cuál es el motivo de la excepción?

Respuesta

16

La primera forma serializa el objeto en el MemoryStream, lo que da como resultado que MemoryStream se coloque al final de los bytes escritos. Desde allí se leen todos los bytes hasta el final en la matriz de bytes: ninguno (porque MemoryStream ya está al final).

Puede mover la posición dentro de la MemoryStream al inicio antes de leer de él:

ms.Seek(0, SeekOrigin.Begin); 

Pero el código a continuación, hace exactamente lo mismo que la segunda manera: crear una nueva matriz de bytes de longitud ms.Length y copie todos los bytes de la secuencia a la matriz de bytes. Entonces, ¿por qué reinventar la rueda?

Tenga en cuenta que la segunda forma no requiere la búsqueda, ya que ToArray siempre copia todos los bytes, independientemente de la posición del MemoryStream.

+0

Ah, bien, estaba mirando eso por un tiempo tratando de resolverlo :) –

+0

@dtb, Gracias. Ahora entendí el problema – Ragunath

+0

@dtb muchas gracias pasé unos días en este asunto T__T –

0

Debe buscar el comienzo de la secuencia en el primer caso, antes de leer el contenido de la secuencia, mientras que en el segundo caso no es necesario buscar antes de la llamada ToArray.