"Ende des Stroms aufgetreten, bevor die Analyse abgeschlossen wurde." Beim Deserialisieren von Datei
Ich habe Folgendes problem: Wenn ich meine app-Einstellungen werden aus einer Datei geladen, so deserialisiert, wenn dies passiert, bekam ich die folgende Fehlermeldung:
{"End of Stream encountered before parsing was completed."} System.Exception {System.Runtime.Serialization.SerializationException}
Serialisierung-code:
using(FileStream write = new FileStream(SETTINGSPATH,FileMode.Create,FileAccess.Write)
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(write,settings);
}
Deserialisation Methode:
using (FileStream read = new FileStream(SETTINGSPATH,FileMode.Open,FileAccess.Read))
{
BinaryFormatter formatter = new BinaryFormatter();
read.Position = 0;
settings = (Settings)formatter.Deserialize(read); //settings is declared as Settings object
}
Einstellungen Klasse:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace Serie_Counter.Overkoepelend
{
public delegate void SelectedMoveOptionChanged(AutoMoveOption selectedOption, int checkInterval = 30 );
public delegate void EnableAutoMoveChanged(bool EnableAutoMove);
[Serializable]
public class Settings
{
private string serieListSavePath;
private bool autoStart;
private bool enableRember;
private bool closeWithMainForm;
private int warningDelay;
//moving options
private bool enableAutoMove;
private string rootFolder;
private int checkInterval;
private AutoMoveOption selectedMoveOption;
public event SelectedMoveOptionChanged selectedMoveOptionChanged;
public event EnableAutoMoveChanged enableAutoMoveChanged;
#region Properties
public string SerieListSavePath
{
get
{
return serieListSavePath;
}
set
{
serieListSavePath = value;
}
}
public bool AutoStart
{
get
{
return autoStart;
}
set
{
autoStart = value;
}
}
public bool EnableRember
{
get
{
return enableRember;
}
set
{
enableRember = value;
}
}
public bool CloseWithMainForm
{
get
{
return closeWithMainForm;
}
set
{
closeWithMainForm = value;
}
}
public int WarningDelay
{
get
{
return warningDelay;
}
set
{
warningDelay = value;
}
}
public bool EnableAutoMove
{
get
{
return enableAutoMove;
}
set
{
enableAutoMove = value;
if (enableAutoMove != null) enableAutoMoveChanged(value);
}
}
public string RootFolder
{
get
{
return rootFolder;
}
set
{
rootFolder = value;
}
}
public int CheckInterval
{
get
{
return checkInterval;
}
set
{
checkInterval = value;
}
}
public AutoMoveOption SelectedMoveOption
{
get
{
return selectedMoveOption;
}
set
{
selectedMoveOption = value;
selectedMoveOptionChanged(value, checkInterval);
}
}
#endregion
public Settings(string serieListSavePath)
{
this.serieListSavePath = serieListSavePath;
}
public Settings()
{
this.serieListSavePath = "series.xml";
warningDelay = -1;
}
[OnDeserialized]
private void SetValuesOnDeserialized(StreamingContext context)
{
selectedMoveOptionChanged = null;
enableAutoMoveChanged = null;
}
Nicht jeder weiß, warum dies geschieht ?
Wenn Sie möchten mehr Infos oder code-bitte überprüfen Sie http://seriescounter.codeplex.com/
Grüßt
Thomas
EDIT: Könnte das problem sein, dass die Deserialisierung schlägt fehl, weil ich die Serialisierung der Ereignisse?
Ich habe gerade getestet, indem Sie sicher, dass die Veranstaltungen sind null, wenn Sie serialisiert. und bisher ist der Fehler nicht wieder passieren.
http://seriescounter.codeplex.com/SourceControl/changeset/changes/12646
- Haben Sie überprüft, wenn die Datei vorhanden und nicht beschädigt?
- Wenn Sie nur Einstellungen zu speichern, dann eine Faustregel ist, verwenden Sie ein lesbares format, wie XML um die Einstellungen zu speichern.
- Poste bitte den code, den Sie verwenden, zu serialisieren und speichern Sie die Einstellungen. Es ist nicht einfach zu finden im link zu codeplex, dass du gepostet hast. Ich vermute, es fehlt möglicherweise eine
Flush
. Auch sind Sie nicht feuern IhreenableAutoMoveChanged
Fall richtig. Sie sollten zuerst kopieren Sie das Ereignis auf eine lokale variablevar ev=enableAutoMoveChanged;
dann prüfen, obev
ist nicht null, dann wird es Feuerev(value);
- Ich prüfe, ob die Datei vorhanden ist-Serialisierung-code: <code> using(FileStream schreiben = new FileStream(SETTINGSPATH,FileMode.Create,FileAccess.Schreiben)) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialisieren(schreiben,Einstellungen); } </code> könnte es sein, ich habe den Fehler, da ich die Serialisierung der Ereignisse?
- Ich würde serialisieren, um ein lesbares format (xml/json) und sehen, was falsch mit den Einstellungen Datei
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern set 12594 Ihr problem ist, Sie hat den checkIntervalChanged event zu den Einstellungen Klasse. Hinzugefügt ein ansonsten unsichtbares Feld der Klasse, der bekommt auch serialisiert. Aber jetzt haben Sie ein problem mit der Einstellung Dateien gespeichert wurden, die mit einer früheren version, die die Serialisierung von Daten nicht enthalten, das Feld, die Ausnahme ist das Ergebnis.
Können Sie retten es so:
Den [NonSerialized] Attribut sorgt nun dafür, dass die backing-Feld nicht serialisiert. Sie wollen nie zu serialisieren von Ereignissen sowieso.
Im Allgemeinen, Sie müssen vorsichtig sein mit binärer Serialisierung, Versionsverwaltung ist schwierig zu behandeln. Sie ein Feld hinzufügen können, und werden sofort wieder alle gespeicherten Daten in den Ordner junk verschoben. Es gibt gute Hinweise in der "Version tolerant serialization" in der MSDN-Bibliothek.
[field: NonSerialized]
auf die Ereignis-Deklaration.