2011-12-20 8 views
6

मैं कुछ सी # नेट कोड लिख रहा हूं जो रजिस्ट्री में कुछ मान बचाता है। यह ठीक काम करता है जब तक कि मैं कुछ बाइनरी डेटा को सहेजना नहीं चाहता था।serializable ऑब्जेक्ट को .NET में रजिस्ट्री में सहेजें?

मैं एक List<MyType> वस्तु है जहां 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

@ श्रीनिवास, मेरी वस्तु में एक ऐसे अनुप्रयोग की कॉन्फ़िगरेशन के बारे में जानकारी है जो मैं विकसित कर रहा हूं। क्या Windows रजिस्ट्री एक ऐसा स्थान नहीं है जहां एप्लिकेशन सेटिंग्स सहेजी जा सकें? –

+2

आप एक ऐसी विधि में सूची को पास करने का प्रयास कर रहे हैं जो अनिवार्य रूप से बाइट सरणी की अपेक्षा कर रहा है। आपको अपनी सूची को उस तरह के प्रतिनिधित्व में परिवर्तित करने की आवश्यकता होगी (या तो मेमोरीस्ट्रीम को क्रमबद्ध करके, या एक अलग धारावाहिक का उपयोग करके)। – 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()। लंबाई + "" + ms.ToArray() लंबाई) 'आउटपुट:' 256 1' –

0

मैं आदिम मान संग्रहीत और फिर एक पोको हाइड्रेट जब डेटा खींच लिया जाता है पोको ही भंडारण करने का विरोध किया जाएगा।

+1

आप किस बारे में बात कर रहे हैं? – IllidanS4

+0

@ IllidanS4: वह ऑब्जेक्ट के अलग-अलग गुणों को व्यक्तिगत कुंजी के रूप में संग्रहीत करेगा और उसके बाद ऑब्जेक्ट को उन कुंजी से पुनर्निर्मित करेगा जैसा कि एक ही कुंजी में क्रमबद्ध ऑब्जेक्ट को संग्रहीत करने के विपरीत है। लाभ यह होगा कि आप आसानी से व्यक्तिगत गुणों का उपयोग कर सकते हैं (माना जाता है कि आप सभी तरह से आदिम प्रकारों को मानचित्र बनाते हैं) - हालांकि इसे नुकसान के रूप में भी देखा जा सकता है। – ChrisWue

+0

@ChrisWue और चार साल बाद, मैं अभी भी उत्तर के पाठ को समझ नहीं पाऊंगा। अच्छा! – IllidanS4

2

स्ट्रिंग के रूप में अपनी ऑब्जेक्ट को क्रमबद्ध/अनसुलझा करना बेहतर है। निम्नलिखित उदाहरण में, मैं एक्सएमएल क्रमबद्धता का उपयोग करता हूं। "मान" चर रजिस्ट्री में स्टोर करने के लिए सूची ऑब्जेक्ट है।

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

संबंधित मुद्दे