少し柔軟にXML→クラスへのデシリアライズをしたくなったんですが
よくデータファイルをXMLで作ったりするわけですが。
その読み書きにはDataSetでも良いけど、XmlホゲホゲAttributeで飾ったデータ構造用のクラスを作って、XmlSerializerでシリアライズする方が好みかな(・∀・)
こんなカンジの処理ね。
// 読み込み public static T Load<T>(string filename) { if( File.Exists( filename ) ) { using( XmlTextReader reader = new XmlTextReader( filename ) ) { XmlSerializer serializer = new XmlSerializer( typeof(T) ); return (T)serializer.Deserialize( reader ); } } else { return default(T); } }
// 書き込み public static void Save<T>(string filename, T data) { using( XmlTextWriter writer = new XmlTextWriter( filename, Encoding.UTF8 ) ) { writer.Formatting = Formatting.Indented; XmlSerializer serializer = new XmlSerializer( data.GetType() ); serializer.Serialize( writer, data ); } }
っで、単純にXMLからクラスへデシリアライズするだけならこれで良いんですが、もちっと少し複雑な事をしたい時にどうするのが良いか(・ω・)?
複雑な事って言うのは、クラス構築時にXMLの内容に従ってメソッドを呼び出したり、構築するクラスをポリモーフしたいような時の事。*1
っで、ちょっと考えてみたけれど、あまりスマートな方法も思いつかなかったので、commons digesterモドキを作る事にしてみました(´д`)
本家のソースも眺めたけど、結構びみょ〜(´д`;)な所もある気がするので、おおざっぱな考え方だけ参考にして、実装は自前で。
まあ、要するに、XmlReaderで読みながらXmlNodeType.Element、XmlNodeType.EndElementとかのタイミングでマッチするルールを呼び出して、コンテキスト(現在のパス、オブジェクトスタックとか)を更新しながらオブジェクトを構築していくというもの。
とりあえずコレで、XMLの内容に応じてちょっとは柔軟なオブジェクトの構築ができるかしら?
もっと良い方法があるかな(・ω・)?