2009-05-15 12 views
5

Sto cercando di salvare un elenco <Foo> utilizzando ApplicationSettingsBase, tuttavia emettere solo il seguente, anche se la lista è popolata:Memorizzazione generica List <CustomObject> utilizzando ApplicationSettingsBase

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

Foo è definito come segue:

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

Come posso abilitare ApplicationSettingsBase alla lista del deposito <Foo>?

risposta

10

Concordato con Thomas Levesque:

La classe seguente è stato salvato correttamente/letto posteriore:

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

    public string MashupString { get; set; } 

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

Nota: non avevo bisogno del SerializableAttribute.

Edit: Ecco l'output 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> 

E la classe impostazioni che ho usato:

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

E alla fine gli elementi che ho inserito:

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

Ottima risposta, nell'esempio di codice finale non è necessario specificare privato per fooSettings in quanto verrebbe eseguito all'interno di una funzione. – user1069816

3

In serializzazione XML:

  • I campi non sono serializzati, solo le proprietà
  • Solo proprietà pubbliche vengono serializzati
  • proprietà di sola lettura non vengono serializzati né

quindi non c'è nulla per serializzare nella classe ...

+1

noti che l'elenco restituisce il frammento XML sopra. So che ci sono 9 istanze di Foo nella lista che vengono serializzate, quindi perché non ci sono indicazioni che ci siano oggetti nella lista? –

1

Lo stesso qui descritto da Craig. My Wrapper-Class aveva un costruttore no-arg, ma ha anche un generico List<T> in cui T non ha ottenuto un costruttore no-arg e quindi il salvataggio() non è riuscito.

Ti piace questa:

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

aggiungere un costruttore no-arg ad ogni classe Personalizzata wich che si intende utilizzare nelle impostazioni:

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