我有一个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似乎是一个不错的选择,但我很欣赏一些明确的例子如何处理我的特定字典,因为它不仅仅是“一键一值”,而是一个稍微复杂的“一键多值/字段”。
答案 0 :(得分:1)
您可以做的另一件事是使用内置的序列化程序将其序列化为XML。您将序列化的类型必须实现ISerializable。这是唯一的要求。好处是.NET将为您处理其他所有事情。
答案 1 :(得分:1)
通常,您需要一些自定义类对象的列表才能使用XmlSerializer保存到XML中。 Dictionary不能直接序列化为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>
示例代码不解决任何异常和无效数据。