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