Flux binaire '0' ne contient pas valide BinaryHeader erreur sur la désérialisation

Après avoir cherché une réponse à cette question pour les 2 derniers jours, je suis en espérant que quelqu'un ici peut vous aider.

J'ai écrit un programme en c# à l'aide de VS2012 qui permet d'économiser de l'utilisateur des données de projet à l'aide de BinaryFormatter pour sérialiser une classe sérialisable à un Flux de données avant de les enregistrer dans un fichier. Le programme a été en usage pendant un certain temps, cependant, récemment, un utilisateur ne pouvait pas ouvrir un fichier qu'il a sauvé le jour d'avant. Il m'a envoyé le fichier, et le message d'erreur que je reçois dans le degugger est:

"Flux binaire '0' ne contient pas valide BinaryHeader. Les causes possibles sont invalides flux ou un objet changement de version entre la sérialisation et la désérialisation."

Compte tenu de l'utilisateur enregistré les données de la veille, il n'y a pas eu de changement à la sous-tendent la structure de l'objet ou de format entre la sérialisation et la désérialisation.

Ce problème n'est pas venu avant, m'amenant à croire qu'il doit être très intermittente, et, par conséquent, il n'y a pas de problème évident avec les objets sérialisés et désérialisé.

Les questions que j'ai sont:

Ma compréhension de cette erreur est que le format des données sérialisées ne correspond pas au format de l'objet désérialisé. Est-ce correct? Existe-il d'autres causes?

Si oui, quelle pourrait en être la cause d'une erreur intermittente?

Est-il un moyen de récupérer les données à partir de ce fichier, même si le BinaryFormatter ne pense pas que c'est dans le bon format?

Est-il un moyen plus sûr de sauvegarder et de charger des données? J'ai vu que XmlFormatter semble être un meilleur choix, mais comment cela va aider à assurer l'intégrité des données sauvegardées et rappelées?

Si cela peut aider, le code que j'utilise sérialiser/désérialiser est comme suit:

//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();

OriginalL'auteur dereknash | 2013-04-09