为什么我的ObservableCollection序列化不起作用?
我正在尝试序列化和反序列化此ObservableCollection:
public class DataCollection : ObservableCollection { } 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)); } }
使用此类(如将对象的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); } } }
这是我从我的应用程序中调用它的方式:
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(); } }
但它会创建空文件并挂起(即使没有例外,只是应用程序窗口变为黑色并且没有响应)
var xs = new XmlSerializer(typeof(DataCollection));
- 您的Data类必须具有参数less constructor,否则XmlSerializer将永远无法创建Data实例。
- 您应该存储和检索Data [],而不是存储DataCoollection,而不必执行任何其他操作。
- 存储时,可以调用ToArray方法获取Data []并使用typeof(Data [])进行序列化。
- 阅读时,您可以阅读数组并将项目添加到您的collections中。
经过一些研究后,似乎在序列化ObservableCollection
时存在问题。 有关更多信息,请参阅此博客文章。
综上所述:
问题是事件尚未标记为非序列化。 因此,每当您尝试序列化ObservableCollection的实例时,您还将尝试序列化任何事件处理程序。 当您将集合用于其主要方案(数据绑定)时,您将在事件中附加WPF控件。
(Kent Boogaart)
您的Data
类也会遇到类似的问题; 像这样更新你的PropertyChanged
事件:
[field: NonSerialized] public event PropertyChangedEventHandler PropertyChanged;
除了其他人已经提到的更新,您的Data
类也应标记为Serializable
。
上述就是C#学习教程:为什么我的ObservableCollection序列化不起作用?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/961595.html