Ale*_* P. 3 .net c# xml wpf xml-serialization
我正在尝试序列化和反序列化此ObservableCollection:
public class DataCollection : ObservableCollection<Data>
{
}
public class Data : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool? _enabled;
public string Name { get; set; }
public bool? Enabled
{
get { return _enabled; }
set { _enabled = value; NotifyPropertyChanged("Enabled"); }
}
public Data(string name, bool? enabled)
{
this.ScriptName = name;
this.Enabled = enabled;
}
private void NotifyPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
Run Code Online (Sandbox Code Playgroud)
使用此类(如将对象的Observable collectin保存到XML文件的最简单方法是什么?示例):
class UserPreferences
{
private DataCollection _dataLst;
private const string _dataLstFileName = "Data.xml";
public DataCollection DataLst { get { return _dataLst; } set { _dataLst = value; } }
public UserPreferences()
{
Load();
}
public void Load()
{
if (File.Exists(_dataLstFileName))
{
using (var reader = new StreamReader(_dataLstFileName))
{
var xs = new XmlSerializer(typeof(DataCollection));
_dataLst = (DataCollection) xs.Deserialize(reader);
}
}
else
{
_dataLst = new DataCollection();
}
}
public void Save()
{
using (var writer = new StreamWriter(_dataLstFileName))
{
var xs = new XmlSerializer(typeof(DataCollection));
xs.Serialize(writer, _dataLst);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我从我的应用程序中调用它的方式:
public partial class MainWindow : Window
{
private DataCollection DataLst;
...
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
var userPrefs = new UserPreferences();
userPrefs.DataLst = DataLst; // DataList isn't null and contains correct data
userPrefs.Save();
}
}
Run Code Online (Sandbox Code Playgroud)
但是它会创建空文件并挂起(即使没有例外,只是应用程序窗口变黑并且没有响应)
var xs = new XmlSerializer(typeof(DataCollection));
Run Code Online (Sandbox Code Playgroud)
经过一些研究后,似乎在序列化时存在问题ObservableCollection<T>.有关更多信息,请参阅此博客文章.
综上所述:
问题是事件尚未标记为非序列化.因此,每当您尝试序列化ObservableCollection的实例时,您还将尝试序列化任何事件处理程序.当您将该集合用于其主要方案(数据绑定)时,您将拥有附加到事件的WPF控件.
(Kent Boogaart)
你的Data班级也会遇到类似的问题; PropertyChanged像这样更新您的活动:
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
Run Code Online (Sandbox Code Playgroud)
除了其他人已经提到的更新,您的Data课程也应标记为Serializable.