Как сохранить список объектов в настройках приложения
недавно я познакомился с настройками приложения 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.

затем вы можете использовать два метода для загрузки и сохранения общего списка кортежей (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 опция сериализации как 
- Сериализация Xml
- двоичная сериализация с прото-баф
- сериализация Json
- отображение ORM в некоторую базу данных embedde SQLite в
и много другие...
Я не уверен, что то, что вы хотите сделать, лучше всего сделать в настройках приложения. Возможно, вы захотите изучить XDocument и сохранить необходимые значения в отдельном файле конфигурации.
вы можете написать пользовательские типы для расширения .config файлы. Но это не будет хранить ваши собственные произвольные типы в существующем разделе подтверждения, а добавлять пользовательские разделы.
пользовательский тип конфигурации может, предоставляя полностью пользовательскую логику для дочерних узлов, содержать сериализованные данные XML. Я бы сказал, что это злоупотребление системой конфигурации: она предназначена для хранения параметров не полного состояния.
Если это то, что вы хотите, есть простой пример в документация для ConfigurationSection.
