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





Проблема в том, что Dictionary не сериализуется в XML (хотя это действительно так). У вас есть два варианта. Вы можете указать свои собственные методы сериализации для словаря, а можете обмануть.
Если вас не волнует возможность читать / редактировать значения в XML, вы можете добавить к настройке атрибут [SettingSerializeAs(SettingsSerializeAs.Binary)]. Выполняет свою работу, но это быстрый и грязный подход.
Для сериализуемого строкового словаря см. stackoverflow.com/a/6194818/492336
Я не знаю о каких-либо конкретных проблемах или обходных путях для работы с 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;
}
}
Это ужасное злоупотребление DbConnectionStringBuilder.
Словарь не сохраняется, потому что нет реализации XmlSerializable. Я не уверен, но мне кажется.
Да, я звоню Save (). Все остальные мои настройки сохраняются правильно, кроме моего StringDictionary.