二进制流'0'在反序列化时不包含有效的BinaryHeader错误

本文关键字:有效 包含 BinaryHeader 错误 反序列化 二进制 | 更新日期: 2023-09-27 18:08:11

在过去的两天里,我一直在寻找这个问题的答案,我希望这里有人能帮助我。

我在c#中使用VS2012编写了一个程序,该程序使用BinaryFormatter将用户的项目数据序列化为可序列化的类,然后将其保存为文件。这个程序已经使用了一段时间,但是最近一个用户打不开他前一天保存的文件。他把文件发给了我,我在调试器中得到的错误是:

"二进制流'0'不包含有效的BinaryHeader。可能的原因是在序列化和反序列化之间无效的流或对象版本更改。"

给定用户前一天保存的数据,在序列化和反序列化之间,底层对象结构或格式没有变化。

这个问题以前没有出现过,使我相信它一定是间歇性的,因此对象的序列化和反序列化没有明显的问题。

我的问题是:

我对这个错误的理解是序列化数据的格式与反序列化成的对象的格式不匹配。这是正确的吗?还有其他原因吗?

如果是这样,是什么原因导致这是一个间歇性错误?

是否有任何方法检索数据从这个文件,即使BinaryFormatter不认为它是在正确的格式?

是否有更安全的方式来保存和加载数据?我已经看到XmlFormatter似乎是一个更好的选择,但是这将如何帮助确保保存和召回数据的完整性呢?

如果有帮助的话,我用来序列化/反序列化的代码如下:

//serialize
SEProjectData serializedProject = serializeProjectData();
Stream stream = File.Open(saveFileDialog1.FileName, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, serializedProject);
stream.Close();
//deserialize
Stream stream = File.Open(path, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
SEProjectData projectData = (SEProjectData)bFormatter.Deserialize(stream);
stream.Close();

二进制流'0'在反序列化时不包含有效的BinaryHeader错误

是的,BinaryFormatter可能是版本不兼容的(特别是如果您更改了字段),但这通常会引发不同的错误。您所展示的代码或多或少是不错的(我会使用"using"来确保在异常中及时关闭)。没有转载很难评论——我认为是"损坏的文件"。你有文件吗?也许是零长度?它是否曾经传输或存储在文件系统以外的地方?有很多方法可以弄乱文件内容(参见http://marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html)。

如果你想解决版本问题,我偏向于protobuf-net,但我很有偏见。但它对我们来说非常有效。但这听起来不太像通常的版本问题。