c# – 反序列化不能在MemoryStream上工作

前端之家收集整理的这篇文章主要介绍了c# – 反序列化不能在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,(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的位置无关.

猜你在找的C#相关文章