Десериализация, не работающая над 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 () для заполнения массива байтов. Какова причина Исключения.

10
задан Ragunath 9 February 2010 в 12:08
поделиться

2 ответа

Первым способом происходит сериализация объекта в MemoryStream, в результате чего MemoryStream позиционируется в конце записанных байтов. Оттуда в массив байт считываются все байты: none (потому что MemoryStream уже находится в конце).

Можно переместить позицию внутри MemoryStream в начало до чтения из него:

ms.Seek(0, SeekOrigin.Begin);

Но тогда код делает то же самое, что и во втором случае: создает новый массив байтов длиной ms.Length и копирует все байты из потока в массив байтов. Зачем же изобретать колесо заново?

Обратите внимание, что второй способ не требует Seek, так как ToArray всегда копирует все байты, независимо от положения MemoryStream.

16
ответ дан 3 December 2019 в 21:59
поделиться

Вы должны искать начало потока в первом случае, прежде чем читать содержимое потока, в то время как во втором случае поиск не требуется перед вызовом ToArray .

0
ответ дан 3 December 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: