我有一个Dictionary对象,我想写入磁盘并能够从磁盘读取它。理想情况下,我会避免任何第三方库。使用常规C#4有一种简单的方法吗?
接受答案。
要点:
选项1 - 使用JavaScriptSerializer
优点:无需第三方图书馆。此外,使用更现代的格式,即JSON
缺点:难以阅读 - 未形成。此外,确实需要引用不太常用的System.Web.Extension程序集,即使应用程序与Web无关。
解决方案:
写:
File.WriteAllText("SomeFile.Txt", new JavaScriptSerializer().Serialize(dictionary));
读:
var dictionary = new JavaScriptSerializer()
.Deserialize<Dictionary<string, string>>(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<string, string>>
(File.ReadAllText("SomeFile.txt"));
答案 0 :(得分:9)
如果没有像JSON.Net这样的第三方,请使用JavaScriptSerializer
:
File.WriteAllText("SomeFile.Txt", new JavaScriptSerializer().Serialize(dictionary));
从文件中获取字典:
var dictionary = new JavaScriptSerializer()
.Deserialize<Dictionary<string, string>>(File.ReadAllText("SomeFile.txt"));
唯一需要记住的是在项目引用下添加对System.Web.Extensions
的引用,然后您可以在JavaScriptSerializer
之后使用using System.Web.Script.Serialization;
或者使用JSON.Net,您可以将字典序列化为JSON,然后将其写入文件,然后反序列化,如:
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("1", "Some value 1");
dictionary.Add("2", "Something");
将字典存储在文件中:
string json = JsonConvert.SerializeObject(dictionary);
File.WriteAllText("SomeFile.Txt", json);
从文件中恢复字典:
Dictionary<string, string> previousDictionary =
JsonConvert.DeserializeObject<Dictionary<string, string>>
(File.ReadAllText("SomeFile.txt"));
要比较两个选项,请参阅:JSON.NET JsonConvert vs .NET JavaScriptSerializer
答案 1 :(得分:1)
编写Dictionary的最简单方法是创建一个列表,其中Dictionary的每个条目都转换为XElement。然后创建一个根XElement,其中列表是根的值。您想要使用XElement的原因是因为您可以使用它的Save
方法将其作为XML存储到磁盘。在单行中执行此示例(其中d是词典)
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<string, string> d, string filename)
{
new XElement("root", d.Select(kv => new XElement(kv.Key, kv.Value)))
.Save(filename, SaveOptions.OmitDuplicateNamespaces);
}
public static IDictionary<string, string> Retrieve(string filename)
{
return XElement.Parse(File.ReadAllText(filename))
.Elements()
.ToDictionary(k => k.Name.ToString(), v => v.Value.ToString());
}
答案 2 :(得分:1)
一个旧线程,但我想添加一个简单的答案。 对于 .net 5 和 .netCore 3.0 及更高版本,您可以简单地使用 JsonSerializer。 你只需要你的键和值是可序列化的。
写:
using System.Text.Json;
File.WriteAllText(fileName, JsonSerializer.Serialize(dictionary));
并阅读:
JsonSerializer.Deserialize<Dictionary<string, string>>(fileName);