问题
I have recently became familiar with C# application settings, and it seems cool.
I was searching for a way to store a list of custom objects, but I couldn't find a way!
Actually I saw a post to store int[], but it wasn't helpful for this problem.
I tried to change the config of that solution in order to make it suitable for my problem. the XML config file of that was:
<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User">
<Value Profile="(Default)" />
</Setting>
I tried to address my object as quoted below in the type attribute but it wasn't helpful since it doesn't recognizing my object... I tried "type = List" and "type="tuple[]"
both of these options didn't help me!
I have a class looks like:
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; }
}
and I want to store a list in application setting.
So is there any way to achieve this purpose.
Thanks in advance.
Cheers,
回答1:
You can use BinaryFormatter to serialize list of tuples as byte array and Base64 (as quite efficient way) to store byte array as string
.
First of all change your class to something like that (hint: [SerializableAttribute]):
[Serializable()]
public class tuple
{
public tuple()
{
this.font = new Font("Microsoft Sans Serif", 8);
//....
}
Add property in settings named tuples
and type of string
.
Then you can use two methods to load and save generic list of tuples (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);
}
}
Example:
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();
I leave null
, empty string and exception checking up to you.
回答2:
Application configuration is not the good choice for storing the data at application runtime.
For this use any available in .NET
serialization option like
- Xml Serialization
- Binary serialization with proto-buf
- Json serialization
- ORM mapping to some embedde database Sqlite
and many others...
回答3:
I'm not sure what you're wanting to do is best done in application settings. What you might want to look into is XDocument, and storing the values you need in a seperate configuration file.
回答4:
You can write custom types to extend .config
files. But this will not be storing your own arbitrary types in an existing section of confirmation but adding custom sections.
A custom configuration type could, by providing completely custom logic for child nodes, hold XML serialised data. I would argue that this is abusing the configuration system: it is for storing settings not complete state.
If this is what you want, there is a simple example in the documentation for ConfigurationSection.
来源:https://stackoverflow.com/questions/8688724/how-to-store-a-list-of-objects-in-application-settings