6

ApplicationSettingsBaseを使用してList<Foo>を保存しようとしていますが、リストが入力されていても、次の情報しか出力されません。

<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<Foo>を保存できるようにするにはどうすればよいですか?

4

3 に答える 3

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();
于 2009-05-15T12:48:00.043 に答える
3

XMLシリアル化の場合:

  • フィールドはシリアル化されず、プロパティのみがシリアル化されます
  • パブリックプロパティのみがシリアル化されます
  • 読み取り専用プロパティもシリアル化されません

したがって、クラスでシリアル化するものは何もありません...

于 2009-05-15T11:55:08.173 に答える
1

ここでクレイグが説明したのと同じです。私のラッパークラスには引数なしのコンストラクターがありましたが、引数なしのコンストラクターがないジェネリックもある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;
    }
}

設定で使用するすべてのカスタムクラスに引数なしのコンストラクターを追加します。

public bar() {
    this.baz = "";
}
于 2012-01-25T10:57:08.550 に答える