c# – 反序列化不能在MemoryStream上工作
发布时间:2020-12-15 06:24:03 所属栏目:百科 来源:网络整理
导读://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();//Deseriali
//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的位置无关. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |