2011-12-20 41 views
6

我正在写一些保存一些值到注册表的C#.net代码。它工作得很好,直到我想保存一些二进制数据。在.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或对象无法正确转换。“

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

+0

为什么你要保存在注册表中,为什么不把它保存为xml文件并保存。 – 2011-12-20 17:58:32

+1

@Srinivas,我的对象包含有关我正在开发的应用程序的配置信息。 Windows注册表是否意味着可以保存应用程序设置? – 2011-12-20 17:59:44

+2

您正试图将列表传递给基本上期待字节数组的方法。您需要将您的列表转换为这种表示形式(通过序列化到MemoryStream或使用不同的序列化程序)。 – Joe 2011-12-20 18:03:31

回答

16

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

@ChrisWue试试这个'ms.WriteByte(1); Console.WriteLine(ms.GetBuffer()。Length +“”+ ms.ToArray()。Length)'输出:'256 1' – 2011-12-20 18:19:17

0

我将存储原始值,然后当数据被拉动反对存储POCO本身水合物POCO。

+1

你在说什么? – IllidanS4 2014-03-08 19:04:44

+0

@ IllidanS4:他会将对象的各个属性存储为单个键,然后从这些键中重建对象,而不是将序列化对象存储在单个键中。好处是你可以很容易地操纵单个属性(假设你一直映射到原始类型) - 尽管这也可以被看作是一个缺点。 – ChrisWue 2018-01-30 23:41:25

+0

@ChrisWue四年后,我仍然不明白答案的内容。太好了! – IllidanS4 2018-01-31 00:42:21

2

将字符串序列化或反序列化为对象更好。在下面的例子中,我使用XML序列化。 “值”变量是要存储在注册表中的列表对象。

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

为什么它更好? – Traubenfuchs 2015-01-08 13:12:42