2011-12-20 15 views
6

Estoy escribiendo un código C# .net que guarda algunos valores en el registro. Funcionó bien hasta que quise guardar algunos datos binarios.Guardar el objeto serializable en el registro en .net?

que tienen un objeto List<MyType> donde MyType se parece a esto:

[Serializable] public class MyType 
{ 
public string s {get;set;} 
public string t {get;set;} 
} 

consigo un error con el siguiente código:

List<MyType> objectToSaveInRegistry = getList(); 
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(MySpecialKey, true); 
registryKey.SetValue("MySpecialValueName", objectToSaveInRegistry , RegistryValueKind.Binary); 

El error es: "El tipo de objeto de valor hizo no coincide con el Value ValueKind especificado o el objeto no se pudo convertir correctamente ".

¿Qué puedo hacer para poder guardar mi objeto en el registro?

+0

por qué quieres guardarlo en un registro. ¿Por qué no convertirlo en un archivo xml y guardarlo? –

+1

@Srinivas, mi objeto contiene información sobre la configuración de una aplicación que estoy desarrollando. ¿No se supone que el Registro de Windows es un lugar donde se pueden guardar las configuraciones de la aplicación? –

+2

Está intentando pasar una Lista a un método que básicamente espera una matriz de bytes. Tendrá que convertir su lista a ese tipo de representación (ya sea mediante serialización en un MemoryStream o utilizando un serializador diferente). – Joe

Respuesta

16

Probablemente necesite serializar su objeto primero con la ayuda del BinaryFormatter y almacenarlo en una matriz byte que luego puede pasar a SetValue. Dudo que SetValue serialice el objeto por usted.

Ejemplo rápido:

using (var ms = new MemoryStream()) 
{ 
    var formatter = new BinaryFormatter(); 
    formatter.Serialize(ms, objectToSaveInRegistry); 
    var data = ms.ToArray(); 
    registryKey.SetValue("MySpecialValueName", data, RegistryValueKind.Binary); 
} 
+3

@ChrisWue prueba esto 'ms.WriteByte (1); Console.WriteLine (ms.GetBuffer(). Length + "" + ms.ToArray(). Length) 'Salida:' 256 1' –

0

Me almacenar los valores primitivos y luego hidratar un poco cuando los datos se tira en oposición a almacenar el poco sí.

+1

¿De qué estás hablando? – IllidanS4

+0

@ IllidanS4: Almacenaría las propiedades individuales del objeto como claves individuales y luego reconstruiría el objeto de esas teclas en lugar de almacenar el objeto serializado en una sola clave. La ventaja sería que podría manipular fácilmente las propiedades individuales (suponiendo que haga un mapa hasta llegar a los tipos primitivos), aunque esto también podría verse como una desventaja. – ChrisWue

+0

@ChrisWue Y cuatro años después, todavía no entendería el texto de la respuesta. ¡Bonito! – IllidanS4

2

Es mejor serializar/deserializar su objeto como una cadena. En el siguiente ejemplo, uso la serialización de XML. La variable "valor" es el objeto de lista para almacenar en el registro.

// using Microsoft.Win32; 
// using System.IO; 
// using System.Text; 
// using System.Xml.Serialization; 

string objectToSaveInRegistry; 

using(var stream=new MemoryStream()) 
{ 
    new XmlSerializer(value.GetType()).Serialize(stream, value); 
    objectToSaveInRegistry=Encoding.UTF8.GetString(stream.ToArray()); 
} 

var registryKey=Registry.LocalMachine.OpenSubKey("MySpecialKey", true); 
registryKey.SetValue("MySpecialValueName", objectToSaveInRegistry, RegistryValueKind.String); 
+1

¿Por qué es mejor? – Traubenfuchs

Cuestiones relacionadas