如何读取C#字符串字典并将其写入文件?
我有一个Dictionary对象,我想写入磁盘并能够从磁盘读取它。 理想情况下,我会避免任何第三方库。 使用常规C#4有一种简单的方法吗?
答案接受了。
摘要:
选项1 – 使用JavaScriptSerializer
优点:不需要第三方图书馆。 此外,使用更现代的格式,即JSON
缺点:难以阅读 – 没有形成。 此外,确实需要引用不太常用的System.Web.Extension程序集,即使应用程序与Web无关。
解:
写:
File.WriteAllText("SomeFile.Txt", new JavaScriptSerializer().Serialize(dictionary));
读:
var dictionary = new JavaScriptSerializer() .Deserialize<Dictionary>(File.ReadAllText("SomeFile.txt"));
选项2 – 使用Linq到Xml
优点:不需要第三方图书馆。 通常不需要添加其他引用。 易读。
缺点: XML不像更现代的JSON那样优先。
写:
new XElement("root", d.Select(kv => new XElement(kv.Key, kv.Value))) .Save(filename, SaveOptions.OmitDuplicateNamespaces);
读:
var dictionary = XElement.Parse(File.ReadAllText(filename)) .Elements() .ToDictionary(k => k.Name.ToString(), v => v.Value.ToString());
选项3 – 使用JSON.NET
优点:人类可读。 现代格式。
缺点:必要的第三方图书馆。
解:
写:
File.WriteAllText("SomeFile.Txt", JsonConvert.SerializeObject(dictionary));
读:
var dictionary = JsonConvert.DeserializeObject<Dictionary> (File.ReadAllText("SomeFile.txt"));
如果没有像JSON.Net这样的第三方,请使用JavaScriptSerializer
:
File.WriteAllText("SomeFile.Txt", new JavaScriptSerializer().Serialize(dictionary));
从文件中获取字典:
var dictionary = new JavaScriptSerializer() .Deserialize>(File.ReadAllText("SomeFile.txt"));
唯一要记住的是在项目引用下添加对System.Web.Extensions
引用,然后在using System.Web.Script.Serialization;
之后就可以使用JavaScriptSerializer
using System.Web.Script.Serialization;
或者使用JSON.Net,您可以将字典序列化为JSON,然后将其写入文件,然后反序列化,如:
Dictionary dictionary = new Dictionary(); dictionary.Add("1", "Some value 1"); dictionary.Add("2", "Something");
在文件中存储字典:
string json = JsonConvert.SerializeObject(dictionary); File.WriteAllText("SomeFile.Txt", json);
从文件中获取字典:
Dictionary previousDictionary = JsonConvert.DeserializeObject> (File.ReadAllText("SomeFile.txt"));
有关两个选项之间的比较,请参阅: JSON.NET JsonConvert vs .NET JavaScriptSerializer
编写Dictionary的最简单方法是创建一个列表,其中Dictionary的每个条目都转换为XElement。 然后创建一个根XElement,其中列表是根的值。 您想要使用XElement的原因是因为您可以使用它的Save
方法将其作为XML存储到磁盘。 在单行中执行此示例(其中d是Dictionary)
new XElement("root", d.Select(kv => new XElement(kv.Key, kv.Value))) .Save(filename, SaveOptions.OmitDuplicateNamespaces);
要将文件读入字典,请使用XElement的Parse静态方法并将文件的整个内容传递给它,该文件可以使用File.ReadAllText
读取。 Parse返回一个XElement对象,即root。 然后,您可以迭代根的Elements()
并将其转换为Dictionary。 您可以在一行中执行此操作:
var d = XElement.Parse(File.ReadAllText(filename)) .Elements() .ToDictionary(k => k.Name.ToString(), v => v.Value.ToString());
这是上面包含的方法的一个版本:
public static void Store(IDictionary d, string filename) { new XElement("root", d.Select(kv => new XElement(kv.Key, kv.Value))) .Save(filename, SaveOptions.OmitDuplicateNamespaces); } public static IDictionary Retrieve(string filename) { return XElement.Parse(File.ReadAllText(filename)) .Elements() .ToDictionary(k => k.Name.ToString(), v => v.Value.ToString()); }