//Serialize the ObjectMemoryStream 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 ObjectStream s = new MemoryStream(arrbyte);s.position = 0;Object obj = formatter.Deserialize(s);//Throws an Exceptions.Close();
如果我尝试以上述方式进行反序列化,则将异常作为
‘二进制流’0’不包含有效的Binaryheader.可能的原因是序列化和反序列化之间的无效流或对象版本的变化.
以下代码正在工作
//Serialize the ObjectIFormatter formatter = new BinaryFormatter();MemoryStream ms = new MemoryStream();formatter.Serialize(ms,ObjectToSerialize);ms.Seek(0,SeekOrigin.Begin);byte[] arrbyte = ms.ToArray();//Deserialize the ObjectStream s= new MemoryStream(byt);stream1.position = 0;Object obj = formatter.Deserialize(s);stream1.Close();
唯一的区别是第一种方法使用Read方法来填充字节数组,其中第二种方法使用Seek& ToArray()填充字节数组.
什么是异常的原因.
在读取之前,可以将MemoryStream中的位置移动到开始位置:
ms.Seek(0,SeekOrigin.Begin);
但是代码与第二种方式完全相同:创建一个ms.Length长度的新字节数组,并将流中的所有字节复制到字节数组.那么为什么要重新发明轮?
请注意,第二种方式不需要Seek,因为ToArray总是复制所有字节,而与MemoryStream的位置无关.
总结以上是内存溢出为你收集整理的c# – 反序列化不能在MemoryStream上工作全部内容,希望文章能够帮你解决c# – 反序列化不能在MemoryStream上工作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)