Как сериализовать словарь Dictionaryа потом десериализовать

Я хочу сохранить данные словаря в бинарный файл (.dat). И при необходимости по ключу доставать оттуда значения.

Dictionary<string, string[]> dictName = new Dictionary<string, string[]>()
        {
            ["Ключ"] = new[] { "значение 1", "значение 2" }
        };

Я пытался многими способами, но то поток закрывается, то он не может найти ключ. Помогите, пожалуйста.


Ответы (1 шт):

Автор решения: aepot

Покажу пример, как записать и прочитать в двоичном виде показанный словарь с помощью BinaryWriter и BinaryReader.

Запись

private static void WriteDictionary(BinaryWriter writer, Dictionary<string, string[]> data)
{
    writer.Write(data.Count);
    foreach (var pair in data)
    {
        writer.Write(pair.Key);
        WriteArray(writer, pair.Value);
    }
}

private static void WriteArray(BinaryWriter writer, string[] array)
{
    writer.Write(array.Length);
    foreach (string item in array)
    {
        writer.Write(item);
    }
}

Чтение

private static Dictionary<string, string[]> ReadDictionary(BinaryReader reader)
{
    int count = reader.ReadInt32();
    Dictionary<string, string[]> data = new Dictionary<string, string[]>();
    for (int i = 0; i < count; i++)
    {
        string key = reader.ReadString();
        data[key] = ReadArray(reader);
    }
    return data;
}

private static string[] ReadArray(BinaryReader reader)
{
    string[] array = new string[reader.ReadInt32()];
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = reader.ReadString();
    }
    return array;
}

Проверяем

static void Main(string[] args)
{
    Dictionary<string, string[]> dictName = new Dictionary<string, string[]>()
    {
        ["Ключ"] = new[] { "значение 1", "значение 2" }
    };

    Console.WriteLine("До сериализации:");
    PrintDictionary(dictName);

    using (var writer = new BinaryWriter(File.Create("data.dat")))
    {
        WriteDictionary(writer, dictName);
    }

    Dictionary<string, string[]> newDict;
    using (var reader = new BinaryReader(File.OpenRead("data.dat")))
    {
        newDict = ReadDictionary(reader);
    }

    Console.WriteLine("После десереализации:");
    PrintDictionary(newDict);

    Console.ReadKey();
}

private static void PrintDictionary(Dictionary<string, string[]> data) 
{
    foreach (var pair in data)
    {
        Console.WriteLine($"[{pair.Key}]: {string.Join(",", pair.Value)}");
    }
}

Вывод в консоль

До сериализации:
[Ключ]: значение 1,значение 2
После десереализации:
[Ключ]: значение 1,значение 2

Содержимое файла

введите сюда описание изображения


Есть еще популярный для старых приложений BinaryFormatter, но он является небезопасным и устаревшим. Например, я могу подсунуть в файл любые данные и BinaryFormatter прекрасно считает их к вам в память, тем самым можно взломать или сломать приложение. Плюс форматтера в том, что и запись и чтение он выполняет автоматически в одну строчку.

→ Ссылка