C# でDictionary をXmlSerializer でシリアライズする

C# のDictionary は普通にやったのではXmlSerializer でシリアライズできないのですが、これを解決する方法はネット上でも色々と紹介されています。


そこをあえて今回自前で解決した方法が以下です。

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace Program
{
    public class Data
    {
        private Dictionary<string, int> table = new Dictionary<string, int>();
        // シリアライズされないよう指定
        [XmlIgnore]
        public Dictionary<string, int> Table
        {
            get { return table; }
        }
        // シリアライズ用にkey:value のペアをカンマ区切りで連結した文字列と相互に変換
        public string TableAsString
        {
            get
            {
                // 
                List<string> data = new List<string>();
                foreach (string key in Table.Keys)
                {
                    data.Add(String.Format("{0}:{1}", key, Table[key]);
                }
                return String.Join(",", data.ToArray());
            }
            set
            {
                char[] separator = new char[]{':'};
                Dictionary<string, int> dict = new Dictionary<string, int>();
                foreach (string pair in value.Split(new char[]{','}))
                {
                    string[] data = pair.Split(separator);
                    dict[data[0]] = int.Parse(data[1]);
                }
                table = dict;
            }
        }
    }
}

なんかもうちょっとDictionary を文字列化するのに一般的なやり方とかありそうな気もしますが、いったん文字列を介するというのがポイントです。