2009-01-08 7 views
8

"System.Collections.Specialized.StringDictionary"유형의 사용자 범위 설정을 만들었습니다. 로컬 설정을 열 때마다 config에서 볼 수 있지만 비어 있습니다.StringDictionary가 사용자 설정으로 저장되지 않음

정확하게 저장하는 다른 사용자 설정이 있지만이 사전은 전혀 저장하지 않는 것 같습니다.

사전을 저장하려면 어떻게해야합니까?

답변

11

문제는 Dictionary이 XML로 직렬화되지 않는다는 것입니다 (실제로는 그렇지만). 두 가지 옵션이 있습니다. 사전에 대한 고유 한 직렬화 방법을 지정하거나 속일 수 있습니다.

XML의 값을 읽거나 편집 할 필요가 없다면 [SettingSerializeAs(SettingsSerializeAs.Binary)] 특성을 설정에 추가 할 수 있습니다. 완료된 작업을 가져 오지만 신속하고 더러운 접근 방식입니다.

+0

예, Save()를 호출하려고합니다. 내 모든 다른 설정은 내 StringDictionary를 제외하고 정확하게 저장됩니다. –

+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

을 참조하십시오. DbConnectionStringBuilder의 끔찍한 악용 사례입니다. – jgmjgm

3

XmlSerializable을 구현하지 않아서 사전이 저장되지 않습니다. 잘 모르겠지만 나에게 보인다.

관련 문제