使用ApplicationSettingsBase </customobject>存储通用List <customobject>

时间:2009-05-15 11:45:11

标签: c# .net serialization applicationsettingsbase

我正在尝试保存列表&lt; Foo&gt;使用ApplicationSettingsBase,但即使列表已填充,它也仅输出以下内容:

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

Foo的定义如下:

[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;
    }
}

如何启用ApplicationSettingsBase来存储List&lt; Foo&gt;?

3 个答案:

答案 0 :(得分:11)

同意Thomas Levesque:

以下课程已正确保存/回读:

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

    public string MashupString { get; set; }

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

注意:我不需要SerializableAttribute

编辑:这里是xml输出:

<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">
                <Foo>
                    <Name>Hello</Name>
                    <MashupString>World</MashupString>
                </Foo>
                <Foo>
                    <Name>Bonjour</Name>
                    <MashupString>Monde</MashupString>
                </Foo>
            </ArrayOfFoo>
        </value>
    </setting>
</WindowsFormsApplication1.MySettings>

我使用的设置类:

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

最后我插入的项目:

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();

答案 1 :(得分:3)

在XML序列化中:

  • 字段未序列化,仅属性
  • 仅序列化公共属性
  • 只读属性未序列化

所以你班上没有什么可以序列化的......

答案 2 :(得分:1)

与克雷格描述的相同。我的Wrapper-Class确实有一个无参数构造函数,但它也有一个通用的List<T>,其中T没有一个无参数的构造函数,所以save()也失败了。

像这样:

public class foo {
    public List<bar> barList;

    public foo() {
        this.barList = new List<bar>();
    }
}

public class bar {
    public string baz;

    public bar(string baz) {
        this.baz = baz;
    }
}

将no-arg构造函数添加到您将在设置中使用的每个自定义类:

public bar() {
    this.baz = "";
}