views:

617

answers:

2

I am trying to save a List<Foo> using ApplicationSettingsBase, however it only outputs the following even though the list is populated:

<setting name="Foobar" serializeAs="Xml">
    <value />
</setting>

Foo is defined as follows:

[Serializable()]
public class Foo
{
    public String Name;
    public Keys Key1;
    public Keys Key2;

    public String MashupString
    {
        get
        {
            return Key1 + " " + Key2;
        }
    }

    public override string ToString()
    {
        return Name;
    }
}

How can I enable ApplicationSettingsBase to store List<Foo>?

+1  A: 

In XML serialization :

  • Fields are not serialized, only properties
  • Read-only properties are not serialized either

So there is nothing to serialize in your class...

Thomas Levesque
Note that the List<Foo> returns the XMl fragment above. I know there are 9 Foo instances in the List being serialized, so why aren't there any indication that there are objects in the List?
Vegard Larsen
+3  A: 

Agreed with Thomas Levesque:

The following class was correctly saved/read back:

public class Foo
{
    public string Name { get; set; }

    public string MashupString { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

Note: I didn't need the SerializableAttribute.

Edit: here is the xml output:

<WindowsFormsApplication1.MySettings>
    <setting name="Foos" serializeAs="Xml">
     <value>
      <ArrayOfFoo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
       <Foo>
        <Name>Hello</Name>
        <MashupString>World</MashupString>
       </Foo>
       <Foo>
        <Name>Bonjour</Name>
        <MashupString>Monde</MashupString>
       </Foo>
      </ArrayOfFoo>
     </value>
    </setting>
</WindowsFormsApplication1.MySettings>

And the settings class I used:

sealed class MySettings : ApplicationSettingsBase
{
    [UserScopedSetting]
    public List<Foo> Foos
    {
        get { return (List<Foo>)this["Foos"]; }
        set { this["Foos"] = value; }
    }
}

And at last the items I inserted:

private MySettings fooSettings = new MySettings();

var list = new List<Foo>()
{
    new Foo() { Name = "Hello", MashupString = "World" },
    new Foo() { Name = "Bonjour", MashupString = "Monde" }
};

fooSettings.Foos = list;
fooSettings.Save();
fooSettings.Reload();
odalet