"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 Ihre enableAutoMoveChanged Fall richtig. Sie sollten zuerst kopieren Sie das Ereignis auf eine lokale variable var ev=enableAutoMoveChanged; dann prüfen, ob ev ist nicht null, dann wird es Feuer ev(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
InformationsquelleAutor Oxillery | 2011-11-13
Schreibe einen Kommentar