【问题标题】:Isolated Storage & Saving Multiple Objects隔离存储和保存多个对象
【发布时间】:2023-03-30 04:30:02
【问题描述】:

我想知道创建保存和加载逻辑的最佳方法是什么,以便我可以保存和加载 x 项。例如,在独立存储中,我可以通过执行以下操作轻松保存复合/POCO 对象:

var settings = IsolatedStorageSettings.ApplicationSettings;
settings.Add("key", myObject);

并像这样加载:

var settings = IsolatedStorageSettings.ApplicationSettings;
return settings["key"] as MyObject;

但是我将如何从 IsolatedStorage 加载 x 数量的对象?最好创建一个List<MyObject> 集合并保存,每当我想保存另一个对象时,我基本上都会加载现有对象并执行.Add(newObject) 并再次保存?

所以是这样的:

List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(newObject);
settings.Add("myObjects", myObjects);

加载时:

var myObjects = settings["myObjects"] as List<MyObject>;

但是,这需要删除集合并将其添加回 settings.Add 需要唯一的密钥。这是最好的方法吗?

我更愿意使用设置而不是 ISO 文件。

【问题讨论】:

  • 我所做的是创建一个 xml 文件并在每次必须保存某些内容时替换它。如果您不经常保存数据并且您的数据很小,那么它工作正常。除此之外,您应该使用“真实”数据库

标签: c# windows-phone-8 isolatedstorage


【解决方案1】:

由于 MSDN :IsolatedStorageSettings 提供了一种方便的方法,可以将用户特定数据作为键值对存储在本地 IsolatedStorageFile 中。典型用途是保存设置,例如每页显示的图像数量、页面布局选项等。

所以我不认为使用IsolatedStorageSettings 是你最好的选择,如果我是你,我会使用IsolatedStorageFile。

要保存和加载列表的内容,场景将是

1- 如果从列表中添加或删除项目,则将列表存储为 xml 并将其保存为 IsolatedStorageFile

 private static void Serialize(string fileName, object source)
    {
        var userStore = IsolatedStorageFile.GetUserStoreForApplication();

        using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Create, userStore))
        {
            XmlSerializer serializer = new XmlSerializer(source.GetType());
            serializer.Serialize(stream, source);
        }
    }

2- 当你想在任何地方加载你的列表时,你会反序列化存储在 IsolatedStorageFile 中的 xml 文件

public static void Deserialize<T>(ObservableCollection<T> list , string filename)
    {

        list = new ObservableCollection<T>();

        var userStore = IsolatedStorageFile.GetUserStoreForApplication();
        if (userStore.FileExists(filename))
        {
            using (var stream = new IsolatedStorageFileStream(filename, FileMode.Open, userStore))
            {
                XmlSerializer serializer = new XmlSerializer(list.GetType());
                var items = (ObservableCollection<T>)serializer.Deserialize(stream);

                foreach (T item in items)
                {
                    list.Add(item);
                }
            }
        }
    }

【讨论】:

  • 嗨,艾哈迈德。为此非常感谢。我可以按原样使用该代码而不进行任何修改吗?在您的代码的第一部分,使用 FileMode.OpenOrCreate 会更好吗?
  • urw,我相信你可以做到!事实上,我无法决定哪个更好(从性能方面来看,可能是 FileMode.OpenorCreate),但我知道 FileMode.Create 会覆盖文件,如果它已经存在,否则创建一个新文件,这就是我需要的这段代码。最后,如果你使用了 FileMode.OpenorCreate ,当你尝试反序列化 xml 文件时会导致异常。
  • 在代码中,我没有看到您保存任何内容。能详细点吗?
  • 尝试阅读更多关于XmlSerializer类和serialze和deserialize方法msdn.microsoft.com/en-us/library/bdxxw552.aspxSerialize方法序列化指定的Object并使用指定的Stream将XML文档写入文件,并且使用var stream创建流= new IsolatedStorageFileStream(filename , FileMode.Open , userstore);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多