如何将 C# 字符串字典读取和写入文件

本文关键字:文件 读取 字典 字符串 | 更新日期: 2023-09-27 18:30:59

我有一个字典对象,我想写入磁盘并能够从磁盘读取它。 理想情况下,我会避免使用任何第三方库。 有没有一种简单的方法可以使用常规 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 to 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"));

如何将 C# 字符串字典读取和写入文件

如果没有像 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的引用,然后您就可以在using System.Web.Script.Serialization;后使用JavaScriptSerializer


或者使用 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

编写字典的最简单方法是创建一个列表,其中字典的每个条目都转换为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 对象,即根。 然后,您可以迭代根的Elements()并将其转换为字典。 您可以在一行中执行此操作:

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());
}

一个旧线程,但我想添加一个简单的答案。对于 .net 5 和 .netCore 3.0 及更高版本,您可以简单地使用 JsonSerializer。您只需要键和值是可序列化的。

写:

using System.Text.Json;
File.WriteAllText(fileName, JsonSerializer.Serialize(dictionary));

并阅读:

JsonSerializer.Deserialize<Dictionary<string, string>>(fileName);