2009-01-08 10 views
8

के रूप में सहेज नहीं रहा है मैंने "System.Collections.Specialized.StringDictionary" प्रकार के साथ एक उपयोगकर्ता स्कोप्ड सेटिंग बनाई है। जब भी मैं स्थानीय सेटिंग्स खोलता हूं, मैं इसे कॉन्फ़िगर में देख सकता हूं, लेकिन यह खाली है।स्ट्रिंग डिक्शनरी उपयोगकर्ता सेटिंग

मेरे पास अन्य उपयोगकर्ता सेटिंग्स हैं जो सही ढंग से सहेजती हैं, लेकिन यह शब्दकोश बिल्कुल बचत नहीं प्रतीत होता है।

क्या मुझे कुछ सहेजने के लिए शब्दकोश करने की आवश्यकता है?

उत्तर

11

समस्या यह है कि Dictionary एक्सएमएल को क्रमबद्ध नहीं करता है (भले ही इसे वास्तव में करना चाहिए)। आपके पास दो विकल्प हैं। आप शब्दकोश के लिए अपने स्वयं के क्रमिकरण विधियों को निर्दिष्ट कर सकते हैं, या आप धोखा दे सकते हैं।

यदि आप XML में मानों को पढ़ने/संपादित करने में सक्षम होने की परवाह नहीं करते हैं, तो आप सेटिंग में [SettingSerializeAs(SettingsSerializeAs.Binary)] विशेषता जोड़ सकते हैं। काम पूरा हो जाता है, लेकिन यह त्वरित और गंदा दृष्टिकोण है।

+0

हां, मैं सेव() को कॉल कर रहा हूं। मेरी सभी अन्य सेटिंग्स मेरी स्ट्रिंग डिक्शनरी को छोड़कर सही ढंग से सहेज रही हैं। –

+0

एक धारावाहिक स्ट्रिंग डिक्शनरी के लिए http://stackoverflow.com/a/6194818/492336 – sashoalm

5

मुझे सेटिंग्स में StringDictionary के साथ काम करने के लिए किसी भी विशिष्ट मुद्दे या कामकाज के बारे में पता नहीं है, लेकिन शायद समस्या को साइड-चरण करें और बस एक स्ट्रिंग के साथ काम करें? आप डेटा को xml, या (शायद सरल) के रूप में केवल एक कुंजी/मान सीमित स्ट्रिंग के रूप में क्रमबद्ध कर सकते हैं? ध्यान दें कि DbConnectionStringBuilder ऐसा करने का एक आसान तरीका प्रदान करता है (नीचे जैसा)।

टोकननाइज्ड स्ट्रिंग "abc = def; ghi = jkl" है, लेकिन यह अधिक जटिल डेटा के लिए स्वचालित रूप से बचने वाले नियमों को संभाल लेगा। एक कोशिश के काबिल है?

using System; 
using System.Collections.Specialized; 
using System.Data.Common; 
public static class Program 
{ 
    static void Main() 
    { 
     StringDictionary lookup = new StringDictionary(); 
     lookup.Add("abc", "def"); 
     lookup.Add("ghi", "jkl"); 

     string foo = Serialize(lookup); 
     Console.WriteLine(foo); 

     StringDictionary bar = Deserialize(foo); 
     foreach (string key in bar.Keys) 
     { 
      Console.WriteLine("{0}={1}", key, bar[key]); 
     } 
    } 
    public static string Serialize(StringDictionary data) 
    { 
     if(data == null) return null; // GIGO 
     DbConnectionStringBuilder db = new DbConnectionStringBuilder(); 
     foreach (string key in data.Keys) 
     { 
      db[key] = data[key]; 
     } 
     return db.ConnectionString; 
    } 
    public static StringDictionary Deserialize(string data) 
    { 
     if (data == null) return null; // GIGO 
     DbConnectionStringBuilder db = new DbConnectionStringBuilder(); 
     StringDictionary lookup = new StringDictionary(); 
     db.ConnectionString = data; 
     foreach (string key in db.Keys) 
     { 
      lookup[key] = Convert.ToString(db[key]); 
     } 
     return lookup; 
    } 

} 
+1

देखें यह डीबीकनेक्शनस्ट्रिंगबिल्डर का एक भयानक दुर्व्यवहार है। – jgmjgm

3

शब्दकोश सहेजा नहीं गया है क्योंकि XmlSerializable को कोई कार्यान्वित नहीं किया गया है। मुझे यकीन नहीं है लेकिन यह मुझे लगता है।

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