正直、今更感はありますが… C# を用いて、XMLファイル を読み込んで オブジェクト を生成する デシリアライズ と、 オブジェクト を XMLファイル へ書き込む シリアライズ を行うサンプルコード を覚書きしておきます。
目次
概要(オブジェクトを読み書きするサンプルコード)
この記事の目標は、次に示す サンプルコード のような読み書きができる仕組み(コード)を作ることです。
目標とする読み書きのサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | namespace Sample { using System; using System.IO; using System.Xml; using System.Xml.Serialization; /// <summary> /// XMLファイルの読み書きを補助する機能を提供します。 /// </summary> public class XmlUtility { /// <summary> /// XMLファイルからシリアライズ可能なオブジェクトを読み込みます。 /// </summary> /// <typeparam name="T">読み込むオブジェクトの型</typeparam> /// <param name="filePath">オブジェクトが保存されたXMLファイルパス /// <returns>デシリアライズされたオブジェクト</returns> 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; } /// <summary> /// シリアライズ可能なオブジェクトをXMLファイルへ書き込みます。 /// </summary> /// <param name="filePath">書き込むXMLファイルパス /// <param name="obj">シリアライズするオブジェクト /// <param name="type">シリアライズするオブジェクトの型 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 の フォロー」 お願いします!!