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