Как сохранить список объектов в настройках приложения

недавно я познакомился с настройками приложения C#, и это кажется классным.
Я искал способ сохранить список пользовательских объектов, но я не мог найти способ!
На самом деле я видел сообщение для хранения int[], но это не полезно для этой проблемы.
Я попытался изменить конфигурацию этого решения, чтобы сделать его подходящим для моей проблемы. файл конфигурации XML этого был:

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User">
  <Value Profile="(Default)" />
</Setting>

Я попытался обратиться к моему объекту, как указано ниже в атрибут type, но он не был полезен, так как он не распознает мой объект... Я попробовал "type = List" и "type=" tuple []"
оба варианта мне не помогли!

у меня класс выглядит так:

class tuple
    {
        public tuple()
        {
            this.font = new Font ("Microsoft Sans Serif",8);
            this.backgroundcolor_color = Color.White;
            this.foregroundcolor_color = Color.Black;
        }
        public string log { get; set; }
        public Font font { get ; set; }
        public String fontName { get; set; }
        public string foregroundcolor { get; set; }
        public Color foregroundcolor_color { get; set; }
        public string backgroundcolor { get; set; }
        public Color backgroundcolor_color { get; set; }
        public Boolean notification { get; set; }
    }

и я хочу сохранить список в настройках приложения.
Так есть ли способ достичь этой цели.
Спасибо заранее.
Ура,

4 ответов


можно использовать BinaryFormatter для сериализации списка кортежей как массива байтов и Base64 (как довольно эффективный способ) для хранения массива байтов как string.

прежде всего измените свой класс на что-то вроде этого (подсказка:[SerializableAttribute]):

[Serializable()]
public class tuple
{
    public tuple()
    {
        this.font = new Font("Microsoft Sans Serif", 8);
    //....
}

добавить свойство в настройках с именем tuples и типа string.

tuples in Settings

затем вы можете использовать два метода для загрузки и сохранения общего списка кортежей (List<tuple>):

void SaveTuples(List<tuple> tuples)
{
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, tuples);
        ms.Position = 0;
        byte[] buffer = new byte[(int)ms.Length];
        ms.Read(buffer, 0, buffer.Length);
        Properties.Settings.Default.tuples = Convert.ToBase64String(buffer);
        Properties.Settings.Default.Save();
    }
}

List<tuple> LoadTuples()
{
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(Properties.Settings.Default.tuples)))
    {
        BinaryFormatter bf = new BinaryFormatter();
        return (List<tuple>)bf.Deserialize(ms);
    }
}

пример:

List<tuple> list = new List<tuple>();
list.Add(new tuple());
list.Add(new tuple());
list.Add(new tuple());
list.Add(new tuple());
list.Add(new tuple());

// save list
SaveTuples(list);

// load list
list = LoadTuples();

я оставляю null, пустая строка и проверка исключений до вас.


Настройки Приложения не является хорошим выбором для хранение данных во время выполнения приложения. Для этого используйте любой доступный в .NET опция сериализации как

и много другие...


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


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

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

Если это то, что вы хотите, есть простой пример в документация для ConfigurationSection.