StringDictionary не сохраняется как пользовательская настройка

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
5 483
3

Ответы 3

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

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

Да, я звоню Save (). Все остальные мои настройки сохраняются правильно, кроме моего StringDictionary.

John Doe 08.01.2009 15:07

Для сериализуемого строкового словаря см. stackoverflow.com/a/6194818/492336

sashoalm 25.10.2016 11:42

Я не знаю о каких-либо конкретных проблемах или обходных путях для работы с 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.

jgmjgm 22.09.2015 20:51

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

Другие вопросы по теме