其實這算是一種折衷的方法,並不是真的建立Hashtable/Dictionary在Properties裡面。
我自己試過的結果,在Properties.Settings.Default裡面雖然可以建立Hashtable(沒法建立Dictionary),但是在程式裡面去讀取這個Hashtable會出現Exception,因為這個型別並沒有被初始化及讀取user.config的值,不像其他Properties.Settings.Default其他型別的值都會自動被建立並初始化讀取user.config的值,所以沒法使用。(至少我不知道如何用)
最後在網路查到使用的方法,就是先將Hashtable/Dictionary的值序列化成XML字串,再用string型別把值塞到Properties.Settings.Default裡面。
讀取出來也是一樣,先讀出string的值,將string反序列化,將值寫回指定的Hashtable/Dictionary。
下面是Source Code參考:
using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml.Serialization; namespace Neil.Tools { public class XMLSerializing { //這邊可以改寫為擴充方法 /// <summary> /// 將Dictionary轉為字串。 /// </summary> /// <typeparam name="T1">Key型別,通常為string</typeparam> /// <typeparam name="T2">Value型別,通常為string</typeparam> /// <param name="d">來源Dictionary</param> /// <returns>傳回轉換後字串</returns> public static string ToDictionaryString<T1,T2>(Dictionary<T1, T2> d) { if (d.Count == 0) return ""; StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); Serialize(sw, d); return sb.ToString(); } //這邊可以改寫為擴充方法 /// <summary> /// 將string轉回Dictionary /// </summary> /// <typeparam name="T1">Key型別,通常為string</typeparam> /// <typeparam name="T2">Value型別,通常為string</typeparam> /// <param name="value">XML格式的文字字串</param> /// <returns>傳回Dictionary<T1,T2></returns> public static Dictionary<T1, T2> ToDictionary<T1,T2>(string value) { Dictionary<T1, T2> d = null; try { d = new Dictionary<T1, T2>(); StringReader sr = new StringReader(value); Deserialize(sr, d); if (d.Count == 0) return null; } catch { } return d; } public static void Serialize(TextWriter writer, IDictionary dictionary) { List<Entry> entries = new List<Entry>(dictionary.Count); foreach (object key in dictionary.Keys) { entries.Add(new Entry(key, dictionary[key])); } XmlSerializer serializer = new XmlSerializer(typeof(List<Entry>)); serializer.Serialize(writer, entries); } public static void Deserialize(TextReader reader, IDictionary dictionary) { dictionary.Clear(); XmlSerializer serializer = new XmlSerializer(typeof(List<Entry>)); List<Entry> list = (List<Entry>)serializer.Deserialize(reader); foreach (Entry entry in list) { dictionary[entry.Key] = entry.Value; } } public class Entry { public object Key; public object Value; public Entry() { } public Entry(object key, object value) { Key = key; Value = value; } } } }
而轉換為XML字串的Dictionary會像下面這種內容存儲在user.config:
<setting name="ListViewColumnsOrder" serializeAs="String"> <value><?xml version="1.0" encoding="utf-16"?> <ArrayOfEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Entry> <Key xsi:type="xsd:string">lvQueryPatient</Key> <Value xsi:type="xsd:string">0,1,2,3,4</Value> </Entry> <Entry> <Key xsi:type="xsd:string">lvQueryStudy</Key> <Value xsi:type="xsd:string">0,1,2,5,3,4</Value> </Entry> </ArrayOfEntry></value> </setting>
沒有留言:
張貼留言