2009-01-08 9 views
8

He creado un usuario con ámbito de ajuste con el tipo "System.Collections.Specialized.StringDictionary". Cada vez que abro la configuración local, puedo verla en la configuración, pero está vacía.StringDictionary no guardar como ajuste del usuario

que tienen otras configuraciones del usuario que ahorran correctamente, pero no parece ser este diccionario ahorro en absoluto.

¿Hay algo que tengo que hacer con el fin de conseguir un diccionario para guardar?

Respuesta

11

El problema es que el Dictionary no serializa en XML (a pesar de que realmente debería). Tienes dos opciones. Puede especificar sus propios métodos de serialización para el diccionario, o puede hacer trampa.

Si no le importa que pueda leer/editar los valores en el XML, puede agregar un atributo [SettingSerializeAs(SettingsSerializeAs.Binary)] a la configuración. Hace el trabajo, pero es el enfoque rápido y sucio.

+0

Sí, llamo Guardar(). Todas mis otras configuraciones están guardando correctamente excepto mi StringDictionary. –

+0

Para un diccionario cadena serializable ver http://stackoverflow.com/a/6194818/492336 – sashoalm

5

No conozco ningún problema específico ni ninguna solución para trabajar con StringDictionary en la configuración, pero ¿tal vez el problema sea el siguiente y simplemente trabaje con una cadena? ¿Podría serializar los datos como xml o (quizás más simple) solo una cadena delimitada por clave/valor? Tenga en cuenta que DbConnectionStringBuilder ofrece una forma sencilla de hacerlo (como se muestra a continuación).

La cadena de tokens es "abc = def; ghi jkl =", pero va a manejar de forma automática escapar reglas, etc. para los datos más complejos. ¿Vale la pena intentarlo?

using System; 
using System.Collections.Specialized; 
using System.Data.Common; 
public static class Program 
{ 
    static void Main() 
    { 
     StringDictionary lookup = new StringDictionary(); 
     lookup.Add("abc", "def"); 
     lookup.Add("ghi", "jkl"); 

     string foo = Serialize(lookup); 
     Console.WriteLine(foo); 

     StringDictionary bar = Deserialize(foo); 
     foreach (string key in bar.Keys) 
     { 
      Console.WriteLine("{0}={1}", key, bar[key]); 
     } 
    } 
    public static string Serialize(StringDictionary data) 
    { 
     if(data == null) return null; // GIGO 
     DbConnectionStringBuilder db = new DbConnectionStringBuilder(); 
     foreach (string key in data.Keys) 
     { 
      db[key] = data[key]; 
     } 
     return db.ConnectionString; 
    } 
    public static StringDictionary Deserialize(string data) 
    { 
     if (data == null) return null; // GIGO 
     DbConnectionStringBuilder db = new DbConnectionStringBuilder(); 
     StringDictionary lookup = new StringDictionary(); 
     db.ConnectionString = data; 
     foreach (string key in db.Keys) 
     { 
      lookup[key] = Convert.ToString(db[key]); 
     } 
     return lookup; 
    } 

} 
+1

Eso es un horrible abuso de DbConnectionStringBuilder. – jgmjgm

3

El diccionario no se guarda porque no hay implemento XmlSerializable. No estoy seguro, pero me parece a mí.

Cuestiones relacionadas