2011-12-20 5 views
6

일부 값을 레지스트리에 저장하는 C# .net 코드를 작성 중입니다. 일부 바이너리 데이터를 저장하기 전까지는 정상적으로 작동했습니다. MyType이 보이는 곳 직렬화 가능 객체를 .net의 레지스트리에 저장 하시겠습니까?

은 내가 List<MyType> 개체가 :

List<MyType> objectToSaveInRegistry = getList(); 
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(MySpecialKey, true); 
registryKey.SetValue("MySpecialValueName", objectToSaveInRegistry , RegistryValueKind.Binary); 

오류는 다음과 같습니다 :

[Serializable] public class MyType 
{ 
public string s {get;set;} 
public string t {get;set;} 
} 

다음 코드에 오류 얻을 "값 개체의 유형을했다 지정된 레지스트리 ValueKind와 일치하지 않거나 개체를 제대로 변환 할 수 없습니다. "

개체를 레지스트리에 저장할 수 있도록하려면 어떻게해야합니까?

+0

왜 레지스트리 파일에 저장하고 싶습니까? XML 파일로 저장하지 마십시오. –

+1

@Srinivas, 내 개체 개발중인 응용 프로그램의 구성에 대한 정보가 들어 있습니다. Windows 레지스트리가 응용 프로그램 설정을 저장할 수있는 장소가 아니 었습니까? –

+2

기본적으로 바이트 배열이 필요한 메서드에 목록을 전달하려고합니다. 그런 종류의 표현으로 목록을 변환해야합니다 (MemoryStream으로 직렬화하거나 다른 직렬기를 사용하여). – Joe

답변

16

BinaryFormatter의 도움으로 먼저 객체를 직렬화하고 byte 배열에 저장하면 SetValue으로 전달할 수 있습니다. 내가 SetValue 당신을 위해 개체를 serialize 의심.

빠른 예 :

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 프리미티브 값을 저장하고 데이터를 마시고 자체를 기억 대향 당겨질 때 마시고 수화 것이다.

+1

무슨 소리 야? – IllidanS4

+0

@ IllidanS4 : 그는 개체의 개별 속성을 개별 키로 저장 한 다음 직렬화 된 개체를 단일 키에 저장하는 대신 키에서 개체를 다시 작성합니다. 장점은 개별 속성을 쉽게 조작 할 수 있다는 것입니다 (기본 유형으로 전체적으로 매핑한다고 가정 할 때). 단점으로 보일 수도 있지만. – ChrisWue

+0

@ChrisWue 그리고 4 년 후, 나는 여전히 그 대답의 본문을 이해할 수 없을 것이다. 좋은! – IllidanS4

2

개체를 문자열로 serialize/unserialize하는 것이 좋습니다. 다음 예제에서는 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

관련 문제