Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I read and write a C# string Dictionary to a file?

I have a Dictionary object and I want to write to disk and be able to read it from disk. Ideally I would avoid any 3rd party libraries. Is there a simple way to do this with regular C# 4?

ANSWER ACCEPTED.

Summary:

OPTION 1 - Using JavaScriptSerializer

Pros: No 3rd party library necessary. Also, uses more modern format, i.e. JSON

Cons: Difficult to read -- not formated. Also, does require reference to less commonly used System.Web.Extension assembly, even when the application has nothing to do with the web.

Solution:

Write:

File.WriteAllText("SomeFile.Txt", new JavaScriptSerializer().Serialize(dictionary));

Read:

var dictionary = new JavaScriptSerializer()
    .Deserialize<Dictionary<string, string>>(File.ReadAllText("SomeFile.txt"));

OPTION 2 - Using Linq to Xml

Pros: No 3rd party library necessary. Typically doesn't require adding additional references. Easily readable.

Cons: XML is not as preferable as something more modern such JSON.

Write:

new XElement("root", d.Select(kv => new XElement(kv.Key, kv.Value)))
            .Save(filename, SaveOptions.OmitDuplicateNamespaces);

Read:

var dictionary = XElement.Parse(File.ReadAllText(filename))
                .Elements()
                .ToDictionary(k => k.Name.ToString(), v => v.Value.ToString());

OPTION 3 - Use JSON.NET

Pros: Human readable. Modern format.

Cons: 3rd party library necessary.

Solution:

Write:

File.WriteAllText("SomeFile.Txt", JsonConvert.SerializeObject(dictionary));

Read:

var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>
    (File.ReadAllText("SomeFile.txt"));
like image 559
zumalifeguard Avatar asked Nov 19 '14 19:11

zumalifeguard


Video Answer


1 Answers

Without a Third Party like JSON.Net, Use JavaScriptSerializer:

File.WriteAllText("SomeFile.Txt", new JavaScriptSerializer().Serialize(dictionary));

Getting dictionary back from file:

var dictionary = new JavaScriptSerializer()
    .Deserialize<Dictionary<string, string>>(File.ReadAllText("SomeFile.txt"));

Only thing to remember is to add reference to System.Web.Extensions under project references and then you will be able to use JavaScriptSerializer after using System.Web.Script.Serialization;


Or with JSON.Net you can serialize your dictionary to JSON and then write it to file and then deserialize it, like:

Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("1", "Some value 1");
dictionary.Add("2", "Something");

Storing Dictionary in file:

string json = JsonConvert.SerializeObject(dictionary);
File.WriteAllText("SomeFile.Txt", json);

Getting Dictionary back from file:

Dictionary<string, string> previousDictionary =
 JsonConvert.DeserializeObject<Dictionary<string, string>>
                                 (File.ReadAllText("SomeFile.txt"));

For comparison between the two options see: JSON.NET JsonConvert vs .NET JavaScriptSerializer

like image 92
Habib Avatar answered Sep 26 '22 00:09

Habib