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
Vous devez vous connecter pour publier un commentaire.
Oui, BinaryFormatter peut être la version intolérant (surtout si vous modifiez les champs), mais qui, généralement, soulève une autre erreur. Le code vous montrer, c'est plus ou moins fines (je préfère utiliser "utiliser" pour assurer la rapidité de fermeture exception). Sans une repro il est difficile de commentaire - je suis en train de penser "fichier endommagé". Avez-vous le fichier? C'est peut-être de longueur nulle? Était-elle jamais transférées ou stockées ailleurs que sur un système de fichiers? Il ya un certain nombre de façons de gâcher le contenu du fichier (voir http://marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html).
Si vous voulez résoudre le problème de gestion des versions, je suis partie à l'protobuf-net, mais je suis très partial. Il fonctionne exceptionnellement bien pour nous. Mais ce n'est pas tout à fait comme d'habitude problème de contrôle de version.
Vous aviez raison Marc, c'était un fichier endommagé. J'ai regardé le stream de lecture de position lors de la levée de l'exception, vérifié que la partie du fichier, et il y a une immense région où le fichier se compose de seulement 00 qui n'est clairement pas le droit. C'est un souci que le fichier a été endommagé lors de la sérialisation ou après avoir été sauvé. La seule chose que je pouvais penser était immédiatement le rechargement et la désérialisation du fichier après l'enregistrement pour vérifier son intégrité, et puis d'alerter l'utilisateur si le fichier ne sera pas désérialiser correctement. Merci encore pour l'aide.
OriginalL'auteur Marc Gravell