gpt4 book ai didi

c# - "End of Stream encountered before parsing was completed."从文件反序列化时

转载 作者:太空狗 更新时间:2023-10-30 00:56:19 29 4
gpt4 key购买 nike

我有以下问题:当我启动我的应用程序时,设置是从文件加载的,因此反序列化,发生这种情况时我收到以下错误:

{“解析完成前遇到流结束。”} System.Exception {System.Runtime.Serialization.SerializationException}

序列化代码:

using(FileStream write = new FileStream(SETTINGSPATH,FileMode.Create,FileAccess.Write)
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(write,settings);
}

反序列化方法:

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
}

设置类:

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;

}

有人知道为什么会这样吗?

如果您想了解更多信息或代码,请查看 http://seriescounter.codeplex.com/

问候托马斯

编辑:问题可能是反序列化失败,因为我将事件序列化为?我只是通过确保事件在序列化时为空来测试这一点。到目前为止,错误没有再次发生。

http://seriescounter.codeplex.com/SourceControl/changeset/changes/12646

最佳答案

更改集 12594 是您的问题,您将 checkIntervalChanged 事件添加到设置类。这也为被序列化的类添加了一个不可见的字段。但是现在你在用以前版本保存的设置文件时遇到问题,序列化数据不包含该字段,结果是异常。

你可以这样拯救它:

    [Serializable]
public class Settings {
[NonSerialized]
private CheckIntervalChanged checkIntervalChangedBacking;

public event CheckIntervalChanged CheckIntervalChanged {
add { checkIntervalChangedBacking += value; }
remove { checkIntervalChangedBacking -= value; }
}
// etc..
}

[NonSerialized] 属性现在确保支持字段不会被序列化。无论如何,您永远不想序列化事件。

一般来说,你需要小心二进制序列化,版本控制很难处理。添加一个字段可以并且会立即将任何存储的数据变成垃圾。 MSDN 库中的“Version tolerant serialization”部分有很好的提示。

关于c# - "End of Stream encountered before parsing was completed."从文件反序列化时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8111290/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com