Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 二进制流';0';反序列化时不包含有效的BinaryHeader错误_C#_Deserialization_Binaryformatter - Fatal编程技术网

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

C# 二进制流';0';反序列化时不包含有效的BinaryHeader错误,c#,deserialization,binaryformatter,C#,Deserialization,Binaryformatter,在过去的两天里,我一直在寻找这个问题的答案,希望这里的人能帮上忙 我用VS2012用c#编写了一个程序,它使用BinaryFormatter保存用户的项目数据,在将可序列化类保存到文件之前将其序列化到流中。该程序已经使用了一段时间,但是最近一个用户无法打开前一天保存的文件。他给我发了文件,我在脱胶机上得到的错误是: “二进制流“0”不包含有效的BinaryHeader。可能的原因是序列化和反序列化之间的无效流或对象版本更改。” 假设用户在前一天保存了数据,那么在序列化和反序列化之间,底层对象结构

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

我用VS2012用c#编写了一个程序,它使用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();

是的,BinaryFormatter可能是版本不可容忍的(尤其是在更改字段时),但这通常会引发不同的错误。您显示的代码或多或少都很好(我会使用“using”来确保异常情况下的提示关闭)。如果没有重新编辑,很难评论——我认为是“损坏的文件”。你有档案吗?它可能是零长度吗?它是否曾被传输或存储在文件系统之外?有多种方法可以将文件内容弄乱(请参阅)


如果你想解决版本控制问题,我倾向于protobuf-net,但我非常偏袒。不过,它对我们非常有效。但这听起来不像是常见的版本控制问题。

谢谢您的回复标记。我有这个文件,而且大小还不错。我在文本编辑器中查看了内容,可以辨认出文本顶部的类名,因此我相信它是由我的程序生成的,与您一样,我的想法是它可能在序列化或存储过程中受损。出于兴趣,你说的“无需复制”是什么意思?你说得对,马克,那是一份损坏的文件。当抛出异常时,我查看了流读取位置,检查了文件的这一部分,并且有一个很大的区域,其中文件仅由00组成,这显然是不正确的。令人担心的是,该文件在序列化过程中或保存后已被损坏。我能想到的唯一一件事就是在保存后立即重新加载并反序列化文件,以检查其完整性,然后在文件无法正确反序列化时提醒用户。再次感谢你的帮助。