我正在编写一些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不匹配,或者无法正确转换对象。”
我可以做什么,以便将对象保存在注册表中?
答案 0 :(得分: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);
}
答案 1 :(得分:2)
最好将对象序列化/反序列化为字符串。在以下示例中,我使用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);
答案 2 :(得分:0)
我会存储原始值,然后在拉出数据时将poco水合而不是存储poco本身。