如何在本地保存整个字典并在需要时加载它

本文关键字:加载 字典 保存 | 更新日期: 2023-09-27 18:34:01

我有一个C#程序,它从网页中检索数据,然后将内容组织到字典中。到目前为止,每次我运行它时,程序都会从 Web 获取数据,因为没有替代数据源。问题是,如果我处于脱机状态,则无法检索数据,因此我没有数据可以使用。是否可以在本地保存整个字典,以便即使脱机也可以加载它并运行分析?

要保存的字典是 myData:

Dictionary<string, itemdata> myData = new Dictionary<string, itemdata>();

其中键是一个字符串,表示项目的名称,而 itemdata 又定义为:

public class itemdata
{
    // Fields
    public double itemWeight;
    public double itemSize;
    public double itemPrice;
    // class constructor
    public itemdata(double myItemWeight, double myItemSize, double myItemPrice)
    {
        itemWeight= myItemWeight;
        itemSize= myItemSize;
        itemPrice= myItemPrice;
    }
    // Public properties (read only access to these fields)
    public double myItemWeight
    {
        get { return itemWeight; }
    }
    public double myItemSize
    {
        get { return itemSize; }
    }
    public double myItemPrice
    {
        get { return itemPrice; }
    }
}

因此,在我的主类中,我检索某些项目的一些数据,然后填充:

itemdata myItemMap = new itemdata (itemWeight, itemSize, itemPrice)

并将所有内容插入字典:

myData.Add(itemName, myItemMap);

一旦所有数据都被检索并组织到 myData 字典中,我希望将其保存在本地。

感谢您到目前为止给我的所有建议。保存到XML似乎是一个不错的选择,但我希望有一些清晰的例子如何处理我的特定字典,因为它不仅仅是"一个键和一个值",而是一个稍微复杂的"具有多个值/字段的键"。

如何在本地保存整个字典并在需要时加载它

您可以做的另一件事是使用内置的序列化程序将其序列化为 XML。要序列化的类型必须实现 ISerializedable。这是唯一的要求。好消息是.NET将为您处理其他所有事情。

通常,

您需要一些自定义类对象的列表才能使用XmlSerializer保存到XML中。字典不能直接序列化为 XML。在这里,我提供示例使用:

class Program
{
  static void Main(string[] args)
  {
    var myData = new Dictionary<string, ExampleDataClass>()
    {
      { "First", new ExampleDataClass() { Name = "John", Surname = "Doe" } },
      { "Second", new ExampleDataClass() { Name = "Foo", Surname = "Bar" } }
    };
    var fileName = @"C:'MyPath'dict.xml";
    myData.SaveToXml(fileName);
    myData.Clear();
    myData = MySerializer.LoadFromXml<string, ExampleDataClass>(fileName);
  }
}
public class ExampleDataClass
{
  public string Name { get; set; }
  public string Surname { get; set; }
}
public class KeyValue<TKey, TValue>
{
  public TKey Key { get; set; }
  public TValue Value { get; set; }
}
static class MySerializer
{
  public static void SaveToXml<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string fileName)
  {
    var serializer = new XmlSerializer(typeof(List<KeyValue<TKey, TValue>>));
    using (var s = new StreamWriter(fileName))
    {
      serializer.Serialize(s, dictionary.Select(x => new KeyValue<TKey, TValue>() { Key = x.Key, Value = x.Value }).ToList());
    }
  }
  public static Dictionary<TKey, TValue> LoadFromXml<TKey, TValue>(string fileName)
  {
    var serializer = new XmlSerializer(typeof(List<KeyValue<TKey, TValue>>));
    using (var s = new StreamReader(fileName))
    {
      var list = serializer.Deserialize(s) as List<KeyValue<TKey, TValue>>;
      return list.ToDictionary(x => x.Key, x => x.Value);
    }
  }
}

这会将示例数据保存到这样的 XML 文件中:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfKeyValueOfStringExampleDataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <KeyValueOfStringExampleDataClass>
    <Key>First</Key>
    <Value>
      <Name>John</Name>
      <Surname>Doe</Surname>
    </Value>
  </KeyValueOfStringExampleDataClass>
  <KeyValueOfStringExampleDataClass>
    <Key>Second</Key>
    <Value>
      <Name>Foo</Name>
      <Surname>Bar</Surname>
    </Value>
  </KeyValueOfStringExampleDataClass>
</ArrayOfKeyValueOfStringExampleDataClass>

示例代码不解决任何异常和无效数据。