分類:[C#] 
2013/02/07(Thu) 17:11:17 編集(投稿者)
初心者です。
VisualStudio C# 2010 Expressを使っています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.IO;
namespace DataContractSerializerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = Path.Combine(Environment.CurrentDirectory, "filename.config");
            MySettings setting = new MySettings();
            //書き込むオブジェクトに適当に値を設定
            for (int i = 0; i < 10; i++)
            {
                setting.BoolDictionary.Add(i.ToString(), i % 2 == 0);
                setting.StringDictionary.Add(i.ToString(), i.ToString() + "番目");
            }
            DataContractSerializer serializer1 = new DataContractSerializer(typeof(MySettings));
            //ファイルに書き込む
            using (var fs1 = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
            {
                //シリアル化し、XMLファイルに保存する
                serializer1.WriteObject(fs1, setting);
            }
            DataContractSerializer serializer2 = new DataContractSerializer(typeof(MySettings));
            //ファイルを開く
            using (var fs2 = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                //XMLファイルから読み込み、逆シリアル化する
                var deseriarize = serializer2.ReadObject(fs2);
                //とりあえずキャスト
                var readsetting = (MySettings)deseriarize;
                //表示を行う
                foreach (var pair in readsetting.BoolDictionary)
                {
                    Console.WriteLine(pair.Key.ToString() + " " + pair.Value.ToString());
                }
                foreach (var pair in readsetting.StringDictionary)
                {
                    Console.WriteLine(pair.Key.ToString() + " " + pair.Value.ToString());
                }
            }
        }
        /// <summary>
        /// 設定を保存する型
        /// </summary>
        [Serializable()]
        [DataContract()]
        public class MySettings
        {
            public MySettings()
            {
                this.StringDictionary = new Dictionary<string, string>();
                this.BoolDictionary = new Dictionary<string, bool>();
            }
            [DataMember()]
            public Dictionary<string, string> StringDictionary { get; set; }
            [DataMember()]
            public Dictionary<string, bool> BoolDictionary { get; set; }
        }
    }
}
上記のようにConfigファイルに書き込みを実行したのち、たとえば
setting.StringDictionary.Add(i.ToString(), i.ToString() + "番目");
の行をコメントアウトして再度実行すると読み込みの時にエラーが起こります。
これは当然と言えばまぁ当然なんですが、そのあとConfigファイルをVisualStudioなど開いてみると
明らかにXMLが崩れていて、それが原因で開くことに失敗しているようです。
書き込みを行う前に
File.Delete(fileName);
を追加することにより解決はしますがこれ以外に何か解決法はないでしょうか?
せめて保存する型の定義に変更があってもXMLが崩れないようにする方法はないのでしょうか?