1

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() { }

}

Isoヘルパー

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);
        }
    }
}

A first chance exception of type 'System.Security.SecurityException' occurred in System.Runtime.Serialization.ni.dll保存したファイルを行で読み込もうとすると取得し続けますReadObject(fileStream)が、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() { }

}

そして、この保存/読み込みコレクションのコードは、最初にここで作成され、より使いやすくするために少し変更されました。

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);
        }
    }
}
4

1 に答える 1