【C# Xml】XMLファイルの読み書きの例外まとめ

C# において、XMLファイルの読み書きで例外が発生するパターンをまとめてみました。

ファイル読み書きなので、ユーザー操作による例外も考えられます。それぞれの例外に対して、しっかり対応しておく必要があります。

XMLファイルの読み書きに、XmlSerializer を使用します。クラスオブジェクトをXMLファイルに相互変換するイメージで使うことができます。

目次

XMLファイル書き込み

XMLファイルに書き込む処理は↓のクラスです。

using System.Text;
using System.Xml.Serialization;

namespace XmlProject
{
    /// <summary>
    /// Xmlセーバー
    /// </summary>
    public class XmlSaver
    {
        /// <summary>
        /// XMLファイルに保存する
        /// </summary>
        /// <typeparam name="T">型</typeparam>
        /// <param name="xml">Xmlとして保存するクラス</param>
        /// <param name="filePath">保存するファイルパス</param>
        public static void Save<T>(T xml, string filePath)
        {
            //XmlSerializerオブジェクトを作成
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            //書き込むファイルを開く(UTF-8 BOM無し)
            using (StreamWriter sw = new StreamWriter(filePath, false, new UTF8Encoding(false)))
            {
                //シリアル化し、XMLファイルに保存する
                serializer.Serialize(sw, xml);
            }
        }
    }
}

フォルダが存在しない

Save関数の引数で指定したfilePathで、フォルダが存在しない場合です。StreamWriter 生成時に、DirectoryNotFoundException の例外が発生します

他プロセスで使用

Save関数の引数で指定したfilePathのファイルが、エディタで開いているなど、他プロセスで使用している場合です。StreamWriter生成時に、IOException の例外が発生します

対応するクラスが不正

Save 関数の第1引数 xml のジェネリクスの型は以下の制約があります。

制約
  1. public クラスとする
  2. メンバ変数はpublicとする
  3. publicで引数のないコンストラクタを実装する

1.と3. を守っていない場合は、XmlSerializer の生成時に、InvalidOperationException が発生します

2. を守っていない場合は、そのメンバ変数はXMLファイルに書き込まれません。例外は発生しません。

XMLファイルの読み込み

XMLファイルに書き込む処理は↓です。

using System.Text;
using System.Xml.Serialization;

namespace XmlProject
{
    /// <summary>
    /// Xmlローダー
    /// </summary>
    internal class XmlLoader
    {
        // XMLファイルをロードする
        public static T Load<T>(string path)
        {
            //XmlSerializerオブジェクトを作成
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            //読み込むファイルを開く
            using (StreamReader sr = new StreamReader(path, new UTF8Encoding(false)))
            {
                //XMLファイルから読み込み、逆シリアル化する
                T t = (T?)serializer.Deserialize(sr) ?? throw new Exception();
                return t;
            }
        }
    }
}

ファイルが存在しない

Load関数のpath で指定される場所に、ファイルが存在しない場合です。StreamReaderの生成時に、FileNotFoundExceptionが発生します

XMLファイルが不正

以下の不正なファイルの場合、XmlSerializer がDeserializeするときにInvalidOperationExceptionが発生します

不正なファイル
  • XMLファイルでない
    • pngや、jpg など、そもそもXMLファイルでないもの
  • Xmlの形式が不正
    • タグの”>”がないなど、Xmlの文法が不正
  • 型が対応していない
    • Xmlのタグと、型の名前が一致していない
  • タグの要素の内容が変換できない
    • メンバ変数はint型だが、値は”abc”など文字列になっている

対応するクラスが不正

書き込み時と同じ制約があります。

制約
  1. public クラスとする
  2. メンバ変数はpublicとする
  3. publicで引数のないコンストラクタを実装する

1.と3. を守っていない場合は、XmlSerializer の生成時に、InvalidOperationException が発生します

2. を守っていない場合は、そのメンバ変数は、XMLファイルにタグがあっても、書き込まれません。

まとめ

C# において、XMLファイルの読み書きで例外が発生するパターンをまとめてみました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次