2011-12-31 12 views
15

Recientemente me familiaricé con la configuración de la aplicación C# y me parece genial.
Estaba buscando una manera de almacenar una lista de objetos personalizados, ¡pero no pude encontrar la manera! En realidad, vi un post to store int[], pero no fue útil para este problema.
Traté de cambiar la configuración de esa solución para que sea adecuada para mi problema. el archivo de configuración XML de eso era:Cómo almacenar una lista de objetos en la configuración de la aplicación

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

Traté de abordar mi objetivo como se cita a continuación en el atributo type pero no fue muy útil, ya que no reconoce mi objetivo ... Probé "type = lista "y 'type =' tupla []"
estas dos opciones no me ayudó

tengo una clase parece:

class tuple 
    { 
     public tuple() 
     { 
      this.font = new Font ("Microsoft Sans Serif",8); 
      this.backgroundcolor_color = Color.White; 
      this.foregroundcolor_color = Color.Black; 
     } 
     public string log { get; set; } 
     public Font font { get ; set; } 
     public String fontName { get; set; } 
     public string foregroundcolor { get; set; } 
     public Color foregroundcolor_color { get; set; } 
     public string backgroundcolor { get; set; } 
     public Color backgroundcolor_color { get; set; } 
     public Boolean notification { get; set; } 
    } 

y quiero para almacenar una lista de aplicaciones configuración
Así es hay alguna manera de lograr este propósito.
Gracias de antemano.
Saludos,

+0

Posible duplicado de http://stackoverflow.com/questions/8627887/store-a-range-of-values-in-web-config-what-data-structure-to-use/8627974#8627974 – ivowiblo

+0

tomar una mira aquí http://stackoverflow.com/questions/922047/store-dictionarystring-string-in-application-settings podría ser de ayuda ... –

Respuesta

29

Puede usar BinaryFormatter para serializar la lista de tuplas como matriz de bytes y Base64 (como forma bastante eficiente) para almacenar la matriz de bytes como string.

En primer lugar cambiar su clase a algo por el estilo (pista: [SerializableAttribute]):

[Serializable()] 
public class tuple 
{ 
    public tuple() 
    { 
     this.font = new Font("Microsoft Sans Serif", 8); 
    //.... 
} 

añadir una propiedad en configuraciones con nombre y tipo de tuplesstring.

tuples in Settings

A continuación, se pueden utilizar dos métodos para cargar y guardar lista genérica de tuplas (List<tuple>):

void SaveTuples(List<tuple> tuples) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     bf.Serialize(ms, tuples); 
     ms.Position = 0; 
     byte[] buffer = new byte[(int)ms.Length]; 
     ms.Read(buffer, 0, buffer.Length); 
     Properties.Settings.Default.tuples = Convert.ToBase64String(buffer); 
     Properties.Settings.Default.Save(); 
    } 
} 

List<tuple> LoadTuples() 
{ 
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(Properties.Settings.Default.tuples))) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     return (List<tuple>)bf.Deserialize(ms); 
    } 
} 

Ejemplo:

List<tuple> list = new List<tuple>(); 
list.Add(new tuple()); 
list.Add(new tuple()); 
list.Add(new tuple()); 
list.Add(new tuple()); 
list.Add(new tuple()); 

// save list 
SaveTuples(list); 

// load list 
list = LoadTuples(); 

dejo null, cadena vacía y excepción que está comprobando a usted.

+0

Me pregunto por qué este voto negativo, sería bueno saber qué está mal. –

+0

No creo que ** sr ** ('StreamReader') en el método' SaveTuples' sirva para ningún propósito, por lo que la segunda declaración de uso puede eliminarse de manera segura. –

+0

@SaebAmini, tienes razón. Corregido :-). –

0

no estoy seguro de lo que está queriendo hacer es mejor hacerlo en configuración de la aplicación. Lo que puede interesarle es XDocument y almacenar los valores que necesita en un archivo de configuración separado.

+0

Gracias por tu tiempo y consideración si lo deseas, dame algunas pistas sobre XDocument y que es? y ¿qué quieres decir con almacenar los valores en un archivo de configuración separado? – Ehsan

+0

XDocument es una de las clases para manipular archivos xml dentro de .NET. http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx Si realmente está buscando almacenar toda la estructura, la serialización de XML podría ser su mejor opción. – Hammerstein

0

Puede escribir tipos personalizados para ampliar los archivos .config. Pero esto no almacenará sus propios tipos arbitrarios en una sección existente de confirmación, sino que agregará secciones personalizadas.

Un tipo de configuración personalizada podría, al proporcionar una lógica completamente personalizada para los nodos secundarios, contener datos XML serializados. Yo diría que esto está abusando del sistema de configuración: es para almacenar configuraciones no completas.

Si esto es lo que desea, hay un ejemplo simple en la documentación para ConfigurationSection.

+0

Gracias por su respuesta, pero ¿tiene alguna sugerencia para lograr este propósito? para guardar este objeto y recuperarlo más tarde? – Ehsan

+0

@Ehsan Defina una clase personalizada basada en 'ConfigurationSection' con el conjunto de propiedades correcto. Use 'ConfigurationManager' para cargar la configuración (incluidos los niveles de usuario) y, luego, guardar. – Richard

2

La configuración de la aplicación no es la mejor opción para almacenar los datos en el tiempo de ejecución de la aplicación. Para este uso de cualquier opción disponible en la serialización .NET como

y muchos otros ..

Cuestiones relacionadas