XMLシリアライズメソッド

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

XMLシリアライズメソッド

投稿記事 by バグ » 13年前

XML形式で簡単に保存・読み込みができるメソッドを作ってみました。
シリアライズ可能なオブジェクトのpublicフィールド、もしくはgetとsetの両方が実装されてあるプロパティが対象となります。

CODE:

using System;
using System.IO;
using System.Xml.Serialization;

/// 
/// XML形式でのファイルへの保存処理
/// 
/// フルパス
/// 保存対象
/// エラー内容
/// true = 正常終了 : false = 異常終了
public static bool Save(string path, T obj, out string err)
{
	// エラーメッセージの初期化
	err = string.Empty;

	// 保存先のディレクトリ存在確認(無い場合は作成)
	try
	{
		string dir = Path.GetDirectoryName(path);
		if (!Directory.Exists(dir))
			Directory.CreateDirectory(dir);
	}
	catch (Exception ex)
	{
		err = ex.Message;
		return false;
	}

	// 保存処理
	bool ret = false;
	using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
	{
		try
		{
			XmlSerializer xml = new XmlSerializer(typeof(T));
			xml.Serialize(fs, obj);
			ret = true;
		}
		catch (Exception ex)
		{
			err = ex.Message;
			ret = false;
		}
	}
	return ret;
}

/// 
/// XML形式のファイルからの読み込み
/// 
/// フルパス
/// 展開先
/// エラー内容
/// true = 正常終了 : false = 異常終了
public static bool Load(string path, out T obj, out string err)
{
	// エラーメッセージの初期化
	err = string.Empty;

	// 読み込み先ファイルの存在確認(無い場合は例外発生)
	try
	{
		if (!File.Exists(path))
			throw new Exception("無効なパスが指定されました");
	}
	catch (Exception ex)
	{
		// 例外が発生したのでfalseを返す
		obj = default(T);
		err = ex.Message;
		return false;
	}

	// 読み込み処理
	bool ret = false;
	using (FileStream fs = new FileStream(path, FileMode.Open))
	{
		try
		{
			XmlSerializer xml = new XmlSerializer(typeof(T));
			obj = (T)(xml.Deserialize(fs));
			ret = true;
		}
		catch (Exception ex)
		{
			obj = default(T);
			err = ex.Message;
		}
	}
	return ret;
}
最後に編集したユーザー バグ on 2012年3月19日(月) 11:01 [ 編集 1 回目 ]

アバター
沖 滉均
記事: 237
登録日時: 14年前

RE: XMLシリアライズメソッド

投稿記事 by 沖 滉均 » 13年前

プロパティにも対応してるのか、ふむふむ使いどころはあるかもしれない。
XMLって便利なんだけどもなかなか社内ツールとしてはサポートしにくい機能なんだよね。
テキスト形式での設定読み書きじゃないと、わからないっていう人が(主に海外の現場に)多くてねぇ…

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

RE: XMLシリアライズメソッド

投稿記事 by バグ » 13年前

>>オッキー
実際できあがるファイルはテキスト形式とあんまり変わらないんだけどね。
ただ、見た目がHTMLっぽくなるから、何も知らない人が見ると面食らうかもしんないけど・・・w