StringDictionary не сохраняется как пользовательская настройка - PullRequest
8 голосов
/ 08 января 2009

Я создал пользовательскую настройку с типом «System.Collections.Specialized.StringDictionary». Всякий раз, когда я открываю локальные настройки, я вижу это в конфиге, но он пуст.

У меня есть другие пользовательские настройки, которые сохраняются правильно, но этот словарь, похоже, не сохраняет вообще.

Что мне нужно сделать, чтобы сохранить словарь?

Ответы [ 3 ]

11 голосов
/ 08 января 2009

Проблема в том, что Dictionary не сериализуется в XML (даже если это действительно так). У вас есть два варианта. Вы можете указать свои собственные методы сериализации для словаря или обмануть.

Если вам не нужна возможность читать / редактировать значения в XML, вы можете добавить атрибут [SettingSerializeAs(SettingsSerializeAs.Binary)] в настройку. Выполняет работу, но это быстрый и грязный подход.

5 голосов
/ 08 января 2009

Я не знаю ни о каких конкретных проблемах или обходных путях для работы с StringDictionary в настройках, но, возможно, обойти проблему и просто работать со строкой? Вы могли бы сериализовать данные как XML или (возможно, проще) просто строку с ключом / значением? Обратите внимание, что DbConnectionStringBuilder предлагает простой способ сделать это (как показано ниже).

Маркированная строка имеет вид «abc = def; ghi = jkl», но она автоматически обрабатывает экранирующие правила и т.д. для более сложных данных. Стоит попробовать?

using System;
using System.Collections.Specialized;
using System.Data.Common;
public static class Program
{
    static void Main()
    {
        StringDictionary lookup = new StringDictionary();
        lookup.Add("abc", "def");
        lookup.Add("ghi", "jkl");

        string foo = Serialize(lookup);
        Console.WriteLine(foo);

        StringDictionary bar = Deserialize(foo);
        foreach (string key in bar.Keys)
        {
            Console.WriteLine("{0}={1}", key, bar[key]);
        }
    }
    public static string Serialize(StringDictionary data)
    {
        if(data == null) return null; // GIGO
        DbConnectionStringBuilder db = new DbConnectionStringBuilder();
        foreach (string key in data.Keys)
        {
            db[key] = data[key];
        }
        return db.ConnectionString;
    }
    public static StringDictionary Deserialize(string data)
    {
        if (data == null) return null; // GIGO
        DbConnectionStringBuilder db = new DbConnectionStringBuilder();
        StringDictionary lookup = new StringDictionary();
        db.ConnectionString = data;
        foreach (string key in db.Keys)
        {
            lookup[key] = Convert.ToString(db[key]);
        }
        return lookup;
    }

}
3 голосов
/ 08 января 2009

Словарь не сохраняется, потому что нет реализации XmlSerializable. Я не уверен, но мне кажется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...