反序列化不适用于 MemoryStream

2024-04-13

//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 位于写入字节的末尾。从那里您将所有字节读取到字节数组的末尾:无(因为 MemoryStream 已经位于末尾)。

在读取之前,您可以将 MemoryStream 中的位置移动到开头:

ms.Seek(0, SeekOrigin.Begin);

但代码的执行方式与第二种方式完全相同:创建一个 ms.Length 长度的新字节数组,并将所有字节从流复制到字节数组。那么为什么要重新发明轮子呢?

请注意,第二种方法不需要 Seek,因为 ToArray 始终复制所有字节,与 MemoryStream 的位置无关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化不适用于 MemoryStream 的相关文章

随机推荐