2011-12-20 3 views
6

私はいくつかの値をレジストリに保存するC#.netコードを書いています。いくつかのバイナリデータを保存したいときまでうまくいった。シリアル化可能なオブジェクトを.netのレジストリに保存しますか?

私はMyTypeはこのようになりますList<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ファイルにして保存しないでください。 –

+1

@Srinivas、私のオブジェクトには、私が開発しているアプリケーションの設定に関する情報が含まれています。 Windowsレジストリは、アプリケーション設定を保存できる場所ではありませんか? –

+2

リストを、基本的にバイト配列が必要なメソッドに渡そうとしています。そのような表現にリストを変換する必要があります(MemoryStreamにシリアル化するか、別のシリアライザを使用します)。 – Joe

答えて

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' –

0

Iは、プリミティブ値を格納し、データがPOCO自体を格納する対向引っ張られるPOCOを水和あろう。

+1

あなたはどういうことを言っていますか? – IllidanS4

+0

@ IllidanS4:彼はオブジェクトの個々のプロパティを個々のキーとして保存し、シリアル化されたオブジェクトを単一のキーに格納するのではなく、それらのキーからオブジェクトを再構築します。利点は、個々のプロパティを簡単に操作できることです(プリミティブ型に完全にマップすることを前提にしています)が、これは不利益とみなされる可能性もあります。 – ChrisWue

+0

@ChrisWueそして4年後、私はまだ答えのテキストを理解しません。ニース! – IllidanS4

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); 
+1

なぜそれは良いですか? – Traubenfuchs

関連する問題