【问题标题】:Write/Restore ObservableCollection<T>写入/恢复 ObservableCollection<T>
【发布时间】:2013-11-03 12:49:04
【问题描述】:

我在将 ObservableCollection 保存和恢复到 IsolatedData 时遇到了很大的问题。 我正在尝试使用此代码。

Observable 的辅助类

public class ListItem {
    public String Title { get; set; }
    public bool Checked { get; set; }

    public ListItem(String title, bool isChecked=false) {
        Title = title;
        Checked = isChecked;
    }
    private ListItem() { }

}

IsoHelper

public class IsoStoreHelper {
    private static IsolatedStorageFile _isoStore;
    public static IsolatedStorageFile IsoStore {
        get { return _isoStore ?? (_isoStore = IsolatedStorageFile.GetUserStoreForApplication()); }
    }

    public static void SaveList<T>(string folderName, string dataName, ObservableCollection<T> dataList) where T : class {
        if (!IsoStore.DirectoryExists(folderName)) {
            IsoStore.CreateDirectory(folderName);
        }

        if (IsoStore.FileExists(folderName + "\\" + dataName+".dat")) {
            IsoStore.DeleteFile(folderName + "\\" + dataName + ".dat");
        }

        string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName);
        try {
            using (var stream = new IsolatedStorageFileStream(fileStreamName, FileMode.Create, IsoStore)) {
                var dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
                dcs.WriteObject(stream, dataList);
            }
        } catch (Exception e) {
            Debug.WriteLine(e.Message);
        }
    }

    public static ObservableCollection<T> LoadList<T>(string folderName, string dataName) where T : class {
        var retval = new ObservableCollection<T>();

        if (!IsoStore.DirectoryExists(folderName) || !IsoStore.FileExists(folderName + "\\" + dataName + ".dat")) {
            return retval;
        }

        string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName);

        var isf = IsoStore;
        try {
            var fileStream = IsoStore.OpenFile(fileStreamName, FileMode.OpenOrCreate);
            if (fileStream.Length > 0) {
                var dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
                retval = dcs.ReadObject(fileStream) as ObservableCollection<T>;
            }
        } catch {
            retval = new ObservableCollection<T>();
        }

        return retval;
    }
}

我正在尝试以这种方式使用它

public partial class MainPage : PhoneApplicationPage{
    public ObservableCollection<ListItem> ListItems = new ObservableCollection<ListItem>();
    bool isListSaved;
    private void Panorama_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
        if (strTag.Equals("list") ) {
                isListSave = false;
                ListItems = IsoStoreHelper.LoadList<ListItem>("settings", "ListItems");
        } else if (!isListSave) {

                IsoStoreHelper.SaveList<ListItem>("settings", "ListItems", ListItems);
        }
    }
}

当我尝试在ReadObject(fileStream) 行读取保存的文件时,我不断收到A first chance exception of type 'System.Security.SecurityException' occurred in System.Runtime.Serialization.ni.dll,但FileAccess 看起来不错。

任何结论将不胜感激。


已解决:

就像 Dmytro Tsiniavskyi 所说,我完全忘记了 ListItem 中的 [DataContract] 和 [DataMember]。更重要的是,我找到了保存和加载数据的更好解决方案。我最终得到了 ListItem 的这段代码

[DataContract]
public class ListItem {
    [DataMember]
    public String Title { get; set; }
    [DataMember]
    public bool Checked { get; set; }

    public ListItem(String title, bool isChecked=false) {
        Title = title;
        Checked = isChecked;
    }
    private ListItem() { }

}

这个用于保存/加载集合的代码最初创建于here,并稍作修改以更好地使用。

public partial class IsolatedRW {
    public static void SaveData<T>(string fileName, T dataToSave) {
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) {
            try {

                if (store.FileExists(fileName)) {
                    store.DeleteFile(fileName);
                }

                if (!store.DirectoryExists("Settings")) store.CreateDirectory("Settings");
                IsolatedStorageFileStream stream;
                using (stream = store.OpenFile("Settings/"+fileName+".xml", System.IO.FileMode.Create, System.IO.FileAccess.Write)) {
                    var serializer = new DataContractSerializer(typeof(T));
                    serializer.WriteObject(stream, dataToSave);
                }
                stream.Close();
            } catch (System.Security.SecurityException e) {
                //MessageBox.Show(e.Message);
                return;
            }
            Debug.WriteLine(store.FileExists("Settings/" + fileName + ".xml"));
        }
    }

    public static T ReadData<T>(string fileName) {
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) {

            Debug.WriteLine(store.FileExists("Settings/" + fileName + ".xml"));
            if (store.FileExists("Settings/" + fileName + ".xml")) {
                IsolatedStorageFileStream stream;
                using (stream = store.OpenFile("Settings/"+fileName+".xml", FileMode.OpenOrCreate, FileAccess.Read)) {

                    try {
                        var serializer = new DataContractSerializer(typeof(T));
                        return (T)serializer.ReadObject(stream);

                    } catch (Exception) {
                        return default(T);
                    }
                }
                stream.Close();
            }
            return default(T);
        }
    }
}

【问题讨论】:

  • 尝试为您的ListItem 类添加[DataContract] 属性。
  • 谢谢你,我完全忘记了 [DataContract] 和 [DataMember] xD add anwser 所以我可以接受它:)

标签: c# .net windows-phone isolatedstorage datacontractserializer


【解决方案1】:

尝试为您的ListItem 类添加[DataContract] 属性。

[DataContract]
public class ListItem {

    [DataMember]
    public String Title { get; set; }

    [DataMember]
    public bool Checked { get; set; }

    public ListItem(String title, bool isChecked=false) {
        Title = title;
        Checked = isChecked;
    }

    private ListItem() { }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2011-09-09
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多