Deserialization не работает с MemoryStream
//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();
Если я попытаюсь выполнить десериализацию с помощью вышеописанного способа, это дает исключение как
'Двоичный поток' 0 'не содержит допустимого BinaryHeader. Возможными причинами являются неверное изменение версии потока или объекта между сериализацией и десериализацией. '
Где ниже работает код
//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();
Единственное отличие заключается в том, что первый подход использует метод Read для заполнения массива байтов, где второй использует Seek и ToArray() для заполнения массива байтов.
В чем причина исключения.
Ответы
Ответ 1
Первый способ сериализации объекта в MemoryStream, который приводит к тому, что MemoryStream позиционируется в конце записанных байтов. Оттуда вы читаете все байты до конца в массив байтов: none (потому что MemoryStream уже в конце).
Вы можете переместить позицию в пределах MemoryStream до начала, прежде чем читать из нее:
ms.Seek(0, SeekOrigin.Begin);
Но код тогда делает то же самое, что и второй способ: создайте новый массив байтов длины ms.Length и скопируйте все байты из потока в массив байтов. Так зачем изобретать колесо?
Обратите внимание, что второй способ не требует, чтобы Seek As ToArray всегда копировал все байты, независимо от положения MemoryStream.
Ответ 2
Вы должны искать начало потока в первом случае перед чтением содержимого потока, тогда как во втором случае поиск не требуется перед вызовом ToArray.