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 のジェネリクスの型は以下の制約があります。
- public クラスとする
- メンバ変数はpublicとする
- 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”など文字列になっている
対応するクラスが不正
書き込み時と同じ制約があります。
- public クラスとする
- メンバ変数はpublicとする
- publicで引数のないコンストラクタを実装する
1.と3. を守っていない場合は、XmlSerializer の生成時に、InvalidOperationException が発生します。
2. を守っていない場合は、そのメンバ変数は、XMLファイルにタグがあっても、書き込まれません。
まとめ
C# において、XMLファイルの読み書きで例外が発生するパターンをまとめてみました。
コメント