将可序列化对象保存到.net中的注册表中?

问题描述 投票:0回答:3

我正在编写一些 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不匹配或无法正确转换对象。”

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

c# .net serialization registry
3个回答
17
投票

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

4
投票

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

1
投票

我会存储原始值,然后在提取数据时水合 poco,而不是存储 poco 本身。

© www.soinside.com 2019 - 2024. All rights reserved.