2012-06-16 6 views
6

Estoy tratando de guardar una clase personalizada para la configuración del usuario pero sin mucho éxito.¿Cómo guardo una clase personalizada para la configuración del usuario utilizando ApplicationSettingsBase?

He creado un proyecto de prueba en Visual Studio 2010 con Target framework = ".NET Framework 4". El formulario principal tiene dos cuadros de texto para mostrar y editar una cadena de prueba simple y el campo "Título" de mi clase personalizada; junto con dos botones para cargar y guardar la configuración.

Finalmente, agregué dos configuraciones "TestString" (un valor de cadena simple) y TestData (tipo de MyDataClass - Lo hice en la pestaña Properties.Settings del proyecto seleccionando "Browse ..." en la lista desplegable Type then ingresando manualmente "MyUserSettingsTest.MyDataClass" en el cuadro "Tipo seleccionado", ya que no apareció originalmente en la lista de tipos disponibles, pero luego sí).

Al iniciar la aplicación y hacer clic en LoadSettings, el controlador de eventos carga el mensaje cadena y MyData o, si esto falla, crea una nueva instancia de MyDataClass. Luego puedo editar la cadena simple y el título de datos de prueba en el formulario y hacer clic en Guardar configuración. Si luego vuelvo a editar los valores, haga clic de nuevo en LoadSettings, los últimos valores guardados se restauran como se espera para ambos valores. Hasta aquí todo bien.

El problema es que al salir de la aplicación y reiniciarla, la cadena de prueba simple se restablece, pero el objeto MyData no lo está. Obviamente, el código persiste en MyData a la memoria pero no a la tienda permanente?

El código principal forma es:

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

Mi prueba de código de clase de datos es:

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

No sé si es de ayuda, pero el archivo app.config autogenerado (que contiene la configuración de TestString pero NO TestData !!?) es:

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

El generado automáticamente Settings.Designer.cs archivo es:

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

Por favor, ¿alguien puede decirme lo que estoy haciendo mal o lo extra que necesita hacer para conseguir mi clase personalizada para persistir a la configuración de usuario correctamente.

Respuesta

1

Guarde su objeto personalizado como una cadena serializada. Entonces solo necesitas almacenar una cadena. Por ejemplo, use Json .NET JsonConverter para serializar y deserializar objetos.

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

Posteriormente, se podría leer de nuevo como esto

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

Es mucho más simple que tratar de redefinir la rueda. Mientras la lista sea corta, debería estar bien :) Esto definitivamente está funcionando para mí así que gracias, ¡así de simple! –

Cuestiones relacionadas