2009-05-15 4 views
5

Ich versuche, eine Liste <Foo> mit Application zu speichern, aber nur es gibt die folgenden, obwohl die Liste aufgefüllt wird:Speicherung generische List <CustomObject> mit Application

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

Foo wie folgt definiert ist:

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

Wie kann ich Application aktivieren speichern Liste <Foo>?

Antwort

10

Einverstanden mit Thomas Levesque:

Die folgende Klasse wurde korrekt gespeichert/gelesen zurück:

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

    public string MashupString { get; set; } 

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

Hinweis: ich nicht die SerializableAttribute brauchte.

Edit: hier ist die XML-Ausgabe:

<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> 

Und die Einstellungen Klasse I verwendet:

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

Und endlich die Artikel I eingefügt:

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

Große Antwort, im letzten Codebeispiel müssen Sie nicht für fooSettings private angeben, da dies innerhalb einer Funktion ausgeführt werden würde. – user1069816

3

In XML-Serialisierung:

  • Felder sind nicht serialisiert, nur Eigenschaften
  • nur öffentliche Eigenschaften serialisiert werden
  • Read-only Eigenschaften nicht serialisiert werden entweder

So gibt es nichts in Ihrer Klasse zu serialisieren ...

+1

Beachten Sie, dass die Liste das XML-Fragment oben zurückkehrt. Ich weiß, dass es in der Liste 9 Foo-Instanzen gibt, die serialisiert sind. Warum gibt es dann keinen Hinweis darauf, dass sich Objekte in der Liste befinden? –

1

Das gleiche hier wie Craig beschrieben. Meine Wrapper-Klasse hatte einen Konstruktor ohne Argumente, aber sie hat auch einen generischen Code List<T>, wobei T keinen Konstruktor ohne Argumente hatte, so dass save() fehlschlug.

So:

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

hinzufügen kein argument Konstruktor für jede individuelle Klasse weicht man in den Einstellungen verwenden:

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