2012-06-16 5 views
6

Sto provando a salvare una classe personalizzata per le impostazioni utente, ma non avendo molto successo.Come si salva una classe personalizzata nelle impostazioni utente utilizzando ApplicationSettingsBase?

Ho creato un progetto di test in Visual Studio 2010 con Target framework = ".NET Framework 4". Il modulo principale ha due caselle di testo per visualizzare e modificare una stringa di prova semplice e il campo "Titolo" della mia classe personalizzata; insieme a due pulsanti per caricare e salvare le impostazioni.

Infine, ho aggiunto due impostazioni "TestString" (un valore stringa semplice) e TestData (tipo di MyDataClass - l'ho fatto nella scheda Properties.Settings del progetto selezionando "Sfoglia ..." dall'elenco a discesa Tipo quindi inserire manualmente "MyUserSettingsTest.MyDataClass" nella casella "Tipo selezionato" poiché inizialmente non compare nell'elenco dei tipi disponibili ma successivamente lo fa.)

All'avvio dell'applicazione e facendo clic su LoadSettings il gestore eventi carica il piano string e MyData o, in caso di problemi, crea una nuova istanza di MyDataClass. Posso quindi modificare la stringa semplice e testare i dati Titolo nel modulo e fare clic su SaveSettings. Se poi rieseguo la modifica dei valori, fai clic nuovamente su LoadSettings per ripristinare gli ultimi valori salvati come previsto per entrambi i valori. Fin qui tutto bene.

Il problema è che all'uscita dall'applicazione e riavviarla, la stringa di prova in chiaro viene ripristinata ok ma l'oggetto MyData non lo è! Ovviamente, il codice sta persistendo MyData nella memoria ok ma non nel negozio permanente?

Il codice del modulo principale è:

using System; 
using System.Windows.Forms; 

namespace MyUserSettingsTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public MyDataClass MyData {get;set;} 

     private void loadSettingsButton_Click(object sender, EventArgs e) 
     { 
      this.myTextBox.Text = Properties.Settings.Default.TestString; 
      this.MyData = Properties.Settings.Default.TestData; 

      if (this.MyData == null) 
      { 
       this.MyData = new MyDataClass() { ID = 1, Title = "Default New Title" }; 
      } 

      this.myDataTitleTextBox.Text = this.MyData.Title; 
     } 

     private void saveSettingsButton_Click(object sender, EventArgs e) 
     { 
      this.MyData.Title = this.myDataTitleTextBox.Text; 

      Properties.Settings.Default.TestString = this.myTextBox.Text; 
      Properties.Settings.Default.TestData = this.MyData; 
      Properties.Settings.Default.Save(); 
     } 
    } 
} 

Il mio test codice della classe di dati è:

using System.Configuration; 

namespace MyUserSettingsTest 
{ 
    public class MyDataClass : ApplicationSettingsBase 
    { 
     public MyDataClass() 
     { 
     } 

     private int _id; 
     private string _title; 

     [UserScopedSetting()] 
     [SettingsSerializeAs(SettingsSerializeAs.Xml)] 
     public int ID 
     { 
      get { return _id; } 
      set { _id = value; } 
     } 

     [UserScopedSetting()] 
     [SettingsSerializeAs(SettingsSerializeAs.Xml)] 
     public string Title 
     { 
      get { return _title; } 
      set { _title = value; } 
     } 
    } 
} 

Non so se è di aiuto, ma il file app.config generato automaticamente (che contiene l'impostazione per TestString ma NON TestData !!?) è:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <section name="MyUserSettingsTest.Properties.Settings"  type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <MyUserSettingsTest.Properties.Settings> 
      <setting name="TestString" serializeAs="String"> 
       <value/> 
      </setting> 
     </MyUserSettingsTest.Properties.Settings> 
    </userSettings> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 

Il generato automaticamente File Settings.Designer.cs è:

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:4.0.30319.269 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace MyUserSettingsTest.Properties { 


[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] 
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 

    public static Settings Default { 
     get { 
      return defaultInstance; 
     } 
    } 

    [global::System.Configuration.UserScopedSettingAttribute()] 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
    [global::System.Configuration.DefaultSettingValueAttribute("")] 
    public string TestString { 
     get { 
      return ((string)(this["TestString"])); 
     } 
     set { 
      this["TestString"] = value; 
     } 
    } 

    [global::System.Configuration.UserScopedSettingAttribute()] 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
    public global::MyUserSettingsTest.MyDataClass TestData { 
     get { 
      return ((global::MyUserSettingsTest.MyDataClass)(this["TestData"])); 
     } 
     set { 
      this["TestData"] = value; 
     } 
    } 
} 
} 

favore qualcuno può dirmi che cosa sto facendo male o che cosa in più ho bisogno di fare per ottenere la mia classe personalizzata a persistere per le impostazioni utente in modo corretto.

risposta

1

Salva l'oggetto personalizzato come stringa serializzata. Quindi è necessario solo memorizzare una stringa. Ad esempio, utilizzare Json .NET JsonConverter per serializzare e deserializzare oggetti.

Properties.Settings.Default.TestData = JsonConvert.SerializeObject<MyDataClass>(this.MyData); 

Poi si potrebbe leggere di nuovo come questo

this.MyData = JsonConvert.DeserializeObject<MyDataClass>(Properties.Settings.Default.TestData); 
+1

E 'molto più semplice che cercare di ridefinire la ruota. Finché la lista è breve dovrebbe andare bene :) Questo è sicuramente funzionante per me quindi grazie, così semplice! –