6
votes

Enregistrer l'objet sérialisable au registre dans .NET?

J'écris du code C # .NET qui enregistre certaines valeurs au registre. Cela a fonctionné jusqu'à ce que je voulais enregistrer certaines données binaires.

J'ai une liste code> objet où mytype code> ressemble à ceci: p>

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


3 commentaires

Pourquoi voulez-vous l'enregistrer dans un registre.Lorsque ne pas en faire un fichier XML et l'enregistrer.


@Srinivas, mon objet contient des informations sur la configuration d'une application que je développe. Le registre Windows n'est-il pas destiné à être un endroit où les paramètres d'application peuvent être enregistrés?


Vous essayez de transmettre une liste à une méthode qui s'attend essentiellement à un tableau d'octets. Vous devrez convertir votre liste en ce type de représentation (soit en sérialisant sur une mémoire Morthstream, soit à l'aide d'un sérielizer différent).


3 Réponses :


17
votes

Vous devez probablement sérialiser votre objet en premier avec l'aide du BinaryFormatter et stockez-le dans un Byte code> Vous pouvez passer à setValue code>. Je doute que SetValue code> Serialise l'objet pour vous.

Exemple rapide: P>

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


1 commentaires

@Chriswue essayer ce ms.writebyte (1); Console.writeline (MS.GetBuffer (). Longueur + "" + MS.TOtoarray (). Longueur) Sortie: 256 1



1
votes

Je stockerais les valeurs primitives, puis hydratez un POCO lorsque les données sont tirées par opposition à stocker le POCO lui-même.


3 commentaires

De quoi parles-tu?


@ ILLIDANS4: Il stocke les propriétés individuelles de l'objet sous forme de touches individuelles, puis reconstruisez l'objet de ces clés que par opposition à la conservation de l'objet sérialisé dans une seule touche. L'avantage serait que vous pourriez facilement manipuler des propriétés individuelles (en supposant que vous puissiez bien jusqu'aux types primitifs) - bien que cela puisse également être considéré comme un inconvénient.


@Chriswue et quatre ans plus tard, je ne comprendrais toujours pas le texte de la réponse. Agréable!



4
votes

Il est préférable de sérialiser / de désexeriser votre objet comme une chaîne. Dans l'exemple suivant, j'utilise la sérialisation XML. La variable "valeur" est l'objet de liste à stocker dans le registre.

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


0 commentaires