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

Недавно я познакомился с настройками приложения С#, и это кажется классным.
Я искал способ сохранить список пользовательских объектов, но я не мог найти способ!
Фактически я видел сообщение для хранения 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; }
    }

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

Ответы

Ответ 1

Вы можете использовать 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, пустую строку и проверку исключений до вас.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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