//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 () для заполнения массива байтов. Какова причина Исключения.
Первым способом происходит сериализация объекта в MemoryStream, в результате чего MemoryStream позиционируется в конце записанных байтов. Оттуда в массив байт считываются все байты: none (потому что MemoryStream уже находится в конце).
Можно переместить позицию внутри MemoryStream в начало до чтения из него:
ms.Seek(0, SeekOrigin.Begin);
Но тогда код делает то же самое, что и во втором случае: создает новый массив байтов длиной ms.Length и копирует все байты из потока в массив байтов. Зачем же изобретать колесо заново?
Обратите внимание, что второй способ не требует Seek, так как ToArray всегда копирует все байты, независимо от положения MemoryStream.
Вы должны искать начало потока в первом случае, прежде чем читать содержимое потока, в то время как во втором случае поиск не требуется перед вызовом ToArray .