正直、今更感はありますが… C# を用いて、XMLファイル を読み込んで オブジェクト を生成する デシリアライズ と、 オブジェクト を XMLファイル へ書き込む シリアライズ を行うサンプルコード を覚書きしておきます。
目次
概要(オブジェクトを読み書きするサンプルコード)
この記事の目標は、次に示す サンプルコード のような読み書きができる仕組み(コード)を作ることです。
目標とする読み書きのサンプルコード
namespace Sample
{
public class Main
{
public static void Main()
{
// ファイルからオブジェクトを読み込み(デシリアライズ)
var config = XmlUtility.LoadFromFile<Config>("config.xml");
// ファイルへオブジェクトを保存(シリアライズ)
XmlUtility.SaveToFile("config.xml", config, typeof(Config));
}
}
}
上記のような コード で XML と オブジェクト をやり取りするためには、以下の2つを作成する必要があります。
以下で、それぞれについて詳細を見ていきます。
シリアライズ、デシリアライズ 処理
ここでは「XMLファイル と オブジェクト の間でやり取りをする仕組み」を実装します。
XmlUtility.cs
namespace Sample
{
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
///
/// XMLファイルの読み書きを補助する機能を提供します。
///
public class XmlUtility
{
///
/// XMLファイルからシリアライズ可能なオブジェクトを読み込みます。
///
/// 読み込むオブジェクトの型
/// オブジェクトが保存されたXMLファイルパス
/// デシリアライズされたオブジェクト
public static T LoadFromFile<T>(string filePath)
where T : class
{
T obj = null;
var serializer = new XmlSerializer(typeof(T));
// ファイルが存在するときだけ実行可能
if (!File.Exists(filePath))
{
throw new FileNotFoundException();
}
// ファイルからオブジェクトの読み込み(デシリアライズ)
using (var fs = new FileStream(filePath, FileMode.Open))
{
obj = serializer.Deserialize(fs) as T;
}
return obj;
}
///
/// シリアライズ可能なオブジェクトをXMLファイルへ書き込みます。
///
/// 書き込むXMLファイルパス
/// シリアライズするオブジェクト
/// シリアライズするオブジェクトの型
public static void SaveToFile(string filePath, object obj, Type type)
{
var serializer = new XmlSerializer(type);
// 書き込む書式の設定
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = false;
// ファイルへオブジェクトを書き込み(シリアライズ)
using (var writer = XmlWriter.Create(filePath, settings))
{
serializer.Serialize(writer, obj);
}
}
}
}
読み書きする オブジェクト
ここでは「XMLファイル と オブジェクト の間でやり取りをするルール」を実装します。
Config.cs
namespace Sample
{
using System;
using System.Xml.Serialization;
[Serializable]
[XmlRoot("config")]
public class Config
{
[XmlIgnore]
public DateTime TimeStamp { get; set; }
[XmlAttribute("id")]
public string Id { get; set; }
[XmlElement("server")]
public string ServerName { get; set; }
}
}
属性を設定することで、XMLファイル に対してどのように出力するかを設定できます。 これらをうまく設定、構成することで、任意のオブジェクトやXMLファイルを構成していきます。
- XmlRoot
- ルート要素として XMLファイル へ出力
- XmlIgnore
- XMLファイル へ出力しない
- XmlAttribute
- 属性として XMLファイル へ出力
- XmlElement
- 要素として XMLファイル へ出力
今回、以下のサイトを参考にしました。
- オブジェクトの内容をXMLファイルに保存、復元する: .NET Tips: C#, VB.NET
- MSDN - XmlSerializer クラス
- MSDN - XmlWriterSettings クラス
- MSDN - XmlRootAttribute クラス
- MSDN - XmlIgnoreAttribute クラス
- MSDN - XmlAttributeAttribute クラス
- MSDN - XmlElementAttribute クラス
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!