How to store a list of objects in application settings
Asked Answered
J

5

19

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,

Jotham answered 31/12, 2011 at 14:46 Comment(2)
Possible duplicate of #8628387Tenebrous
take a look at here #922547 it might be helps you...Diluvial
S
40

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.

tuples in Settings

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.

Simson answered 31/12, 2011 at 17:59 Comment(3)
I wonder why this get downvote, it would be nice to know what is wrong.Stakhanovism
I don't think sr (StreamReader) in the SaveTuples method serves any purpose, so the second using statement can be safely removed.Supercharger
Thank you for this.Aplacental
Z
3

Application configuration is not the good choice for storing the data at application runtime. For this use any available in .NET serialization option like

and many others...

Zig answered 31/12, 2011 at 15:0 Comment(0)
H
0

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.

Haemostasis answered 31/12, 2011 at 14:49 Comment(2)
Thanks for your time and consideration could you pleases give me some hints about XDocument and what it is? and what did you mean by storing the values in a seperate config file?Jotham
XDocument is one of the classes for manipulating xml files within .NET. msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx If you're actually looking to store the entire stucture, XML serialization might be your better bet though.Haemostasis
S
0

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.

Secern answered 31/12, 2011 at 14:56 Comment(2)
Thanks for you response, but do you have any suggestion for achieving this purpose? to save this object and retrieve it later?Jotham
@Jotham Define a custom class based on ConfigurationSection with the right set of properties. Use ConfigurationManager to load config (including user levels) and, later, save.Secern
E
0

As Mr.Tigran mentioned You can simply use Newtonsoft.Json Nuget Package to convert your Object(which can be a List or contain a List) using serialization and save it as a string (I made a string variable in Settings with "User Scope" and named it "myString"):

string json = JsonConvert.SerializeObject(myObject);
Properties.Settings.Default.myString = json;
Properties.Settings.Default.Save();

To load it we use deserialization :

string json = Properties.Settings.Default.myString;
myObject myobject = JsonConvert.DeserializeObject<myObject>(json);
Embroil answered 31/10, 2020 at 14:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.