過去 2 日間、この問題に対する回答を探した後、ここの誰かが助けてくれることを願っています。
BinaryFormatter を使用してユーザーのプロジェクト データを保存し、ファイルに保存する前にシリアル化可能なクラスを Stream にシリアル化するプログラムを VS2012 を使用して c# で作成しました。このプログラムはしばらく使用されていますが、最近、あるユーザーが前日に保存したファイルを開くことができませんでした。彼は私にファイルを送ってくれました。デガガーに表示されるエラーは次のとおりです。
「バイナリ ストリーム '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();