Сохранить сериализуемый объект в реестре в .net? - PullRequest
6 голосов
/ 20 декабря 2011

Я пишу код на C # .net, который сохраняет некоторые значения в реестре. Это работало хорошо, пока я не хотел сохранить некоторые двоичные данные.

У меня есть List<MyType> объект, где MyType выглядит так:

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

Я получаю сообщение об ошибке со следующим кодом:

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

Ошибка: «Тип объекта значения не соответствует указанному Registry ValueKind, или объект не может быть должным образом преобразован.»

Что я могу сделать, чтобы сохранить свой объект в реестре?

Ответы [ 3 ]

16 голосов
/ 20 декабря 2011

Вам, вероятно, нужно сначала сериализовать свой объект с помощью BinaryFormatter и сохранить его в массиве byte, который затем можно передать в SetValue. Я сомневаюсь, что SetValue будет сериализовать объект для вас.

Быстрый пример:

using (var ms = new MemoryStream())
{
    var formatter = new BinaryFormatter();
    formatter.Serialize(ms, objectToSaveInRegistry);
    var data = ms.ToArray();
    registryKey.SetValue("MySpecialValueName", data, RegistryValueKind.Binary);
}
2 голосов
/ 20 декабря 2011

Лучше сериализовать / десериализовать ваш объект как строку.В следующем примере я использую сериализацию XML.Переменная «value» - это объект списка для хранения в реестре.

// 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 голосов
/ 20 декабря 2011

Я бы сохранил примитивные значения, а затем выполнил гидрацию poco, когда данные извлекаются вместо сохранения самого poco.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...