在.net中保存可序列化对象到注册表

本文关键字:对象 注册表 序列化 net 保存 | 更新日期: 2023-09-27 18:18:20

我正在编写一些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);

错误是:"值对象的类型与指定的注册表ValueKind不匹配,或者该对象无法正确转换。"

我怎么做才能在注册表中保存我的对象?

在.net中保存可序列化对象到注册表

您可能需要在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);
}

最好将对象序列化/反序列化为字符串。在下面的示例中,我使用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);

我将存储原始值,然后在提取数据时生成poco,而不是存储poco本身。