Как использовать ConfigurationManager для хранения структурированных данных?

Я могу использовать .Net ConfigurationManager для хранения строк, но как я могу хранить структурированные данные?

Например, я могу это сделать:

conf = ConfigurationManager.OpenExeConfiguration(...)
string s = "myval";
conf.AppSettings.Settings["mykey"].Value = s;
conf.Save(ConfigurationSaveMode.Modified);

И я бы хотел это сделать:

class myclass {
   public string s;
   int i;
   ... more elements
};

myclass c = new myclass(); c.s = "mystring"; c.i = 1234; ...

conf.AppSettings.Settings["mykey"] = cc;
conf.Save(ConfigurationSaveMode.Modified);

Как хранить и извлекать структурированные данные с помощью ConfigurationManager?

Я реализовал решение, как предложил @sll. Но тогда сложность заключалась в создании нового раздела в конфигурации. Вот как это делается: Как писать в User.Config через ConfigurationManager?


person niteskate    schedule 13.03.2013    source источник


Ответы (2)


Вы можете создать собственный тип раздела конфигурации, унаследовав его от класса ConfigurationSection, и использовать его для сохранения / загрузки любой информации о настраиваемом типе.

MSDN: Как: создавать настраиваемые разделы конфигурации с помощью ConfigurationSection

Кстати, один совет, который может быть полезен вам или другим: одна хорошая вещь - сделать класс раздела пользовательских конфигураций неизменным (без общедоступных сеттеров), поэтому вы можете быть уверены, что конфигурацию нельзя изменить на любом этапе жизненного цикла приложения, но затем, если вы решите написать модульные тесты для кода, который зависит от класса раздела конфигурации и нуждается в заглушка раздела с некоторыми тестовыми значениями, которые вы могли бы застрять с возможностью установки значений свойств, поскольку нет установщиков. Решение предоставляет новый класс, который унаследован от вашего класса раздела и указывает значения конструктора с помощью защищенного индексатора, как показано ниже:

public class TestSectionClass: MyConfigurationSection
{
    public TestSectionClass(string testUserName)
    {
        this["userName"] = testUserName;
    }
}
person sll    schedule 13.03.2013
comment
Это то, что я искал. Подумал, может в Configuration Manager была какая-то встроенная сериализация ... - person niteskate; 13.03.2013
comment
Не уверен в сериализации, что мне нравится в подходе к настраиваемому разделу конфигурации, так это возможность указывать значения по умолчанию, иметь строго типизированное решение, четкий и удобочитаемый файл конфигурации - person sll; 13.03.2013

Сериализация.

Существует множество различных способов сериализации данных, поэтому вам нужно выбрать один. Но .NET предоставляет API-интерфейс сериализации, который подходит для очень многих случаев, и в последнее время, работая с веб-вызовами AJAX, я обнаружил, что использую _ 1_ сильно, чтобы преобразовать вещи в JSON. Однако существуют сторонние библиотеки, такие как protobuf-net и т. Д.

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

Согласно ответу @sll, .NET имеет еще один аспект, означающий, что он может обрабатывать сериализацию данных в пользовательских разделах конфигурации и из них; хотите ли вы начать явно указывать типы для этой цели или нет - ваш выбор. Итог тот же, сериализовать как-то.

person Grant Thomas    schedule 13.03.2013
comment
Правда! Не знал о классе JavaScriptSerializer. Как и вы, я тоже сейчас довольно часто использую JSON. С этого момента для меня будет очень заманчиво использовать такой полезный класс. :-) - person niteskate; 13.03.2013