问题在隔离存储中存储对象列表

时间:2011-02-22 04:16:33

标签: c# windows list windows-phone-7 stackpanel

我正在尝试存储我在隔离存储中创建的对象列表,并能够通过自动为它们生成标题将它们显示在列表中。到目前为止,代码仍然有效,但是一旦我对应用程序进行了逻辑删除并启动它,除了对象列表之外,我的所有数据都会被保存。我认为我的问题可能在于我首先如何初始化列表,或者可能是我如何显示名称。任何帮助表示赞赏。

此代码位于我的App.xaml.cs:

public partial class App : Application
    {
      public List<my_type> testList = new List<my_type>();

        void loadvalues()
        {
         IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
         List<my_Type> L;
         if (settings.TryGetValue<List<DrinkSesh>>("Storage", out L))
         { testList = L; }
        }

        void savevalues()
        {
        IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
        settings["Storage"] = testList;
        settings.Save();
        }
     }

此代码位于我的主页上,用于将项目添加到列表中:

(Application.Current as App).testList.Add(new my_type());

并且此代码用于在不同页面上将标题实现到屏幕上:

 public different_class()
{
        {
                InitializeComponent();
                for (i = 0; i < (Application.Current as App).testList.Count; i++)
                {
                    CreateATextBlock((Application.Current as    App).testList[i].Title_ToString(), i);
                }
        }

        private void CreateATextBlock(String title,int num)
        {
            testblockname = new TextBlock();
            testblockname.Text = (num + 1) + ". " + title;
            DrList.Children.Add(testblockname);
        }
}

提前谢谢!

2 个答案:

答案 0 :(得分:7)

这是我用来保存和加载来自隔离存储的对象列表的代码。

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

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

        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.Create, IsoStore))
        {
            DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
            dcs.WriteObject(stream, dataList);
        }
    }

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

        if (!IsoStore.DirectoryExists(folderName))
        {
            IsoStore.CreateDirectory(folderName);
        }

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

        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.OpenOrCreate, IsoStore))
        {
            if (stream.Length > 0)
            {
                DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
                retval = dcs.ReadObject(stream) as ObservableCollection<T>;
            }
        }

        return retval;
    }
}

答案 1 :(得分:2)

通过简单地将您的集合(List)添加到IsolatedStorageSettings,您依靠内置的序列化程序(DataContractSerializer)来序列化您的对象以便持久化到磁盘。

您确定您的对象可以正确序列化和反序列化吗?

自己这样做可能是最简单的方法。

如果您自己这样做,而不是: - DataContractSerializer很慢 - DataContractJsonSerializer更快 - Json.net的速度更快 - 二进制序列化最快。

在自己序列化时,您还应该保存在IsolatedStorageFile rahter中而不是设置中。这有助于提高性能并增加灵活性,有助于调试和测试。