2011年2月6日日曜日

C#でXmlシリアライズ/デシリアライズするヘルパー


C#でpublicなプロパティやフィールドをXMLにダンプするモジュールを作りまりた。
コードが横に長くてすみません。めんどくさいのでそのままにします。

 
public static class XmlSerializeHelper
{
private static readonly System.Text.Encoding _encoding = System.Text.Encoding.UTF8;

private static readonly XmlWriterSettings _xmlSettings = new XmlWriterSettings
{
Encoding = _encoding,
NewLineChars = Environment.NewLine,
NewLineHandling = NewLineHandling.None,
};

public static XmlWriterSettings XmlSetting
{
get { return _xmlSettings; }
}

public static void Save<T>( string path, T o )
{
using ( StreamWriter sw = new StreamWriter( path, false, _encoding ) )
{
Save<T>( sw, o );
}
}

public static void Save<T>( StreamWriter sw, T o )
{
using ( XmlWriter writer = XmlWriter.Create( sw, _xmlSettings ) )
{
XmlSerializer xmlSerializer = new XmlSerializer( typeof( T ) );
xmlSerializer.Serialize( writer, o );
}
}

public static T Load<T>( string path )
{
using ( StreamReader sr = new StreamReader( path, _encoding ) )
{
return Load<T>( sr );
}
}

public static T Load<T>( StreamReader sr )
{
using ( XmlReader reader = XmlReader.Create( sr ) )
{
XmlSerializer xmlSerializer = new XmlSerializer( typeof( T ) );
return ( T ) xmlSerializer.Deserialize( reader );
}
}

}


使い方はこんな具合。
 
class SampleData
{
public string Name { get; set; }
public int Value { get; set; }
}

class Program
{
static void Main( string[] args )
{
List<SampleData> samples = new List<SampleData>{
new SampleData
{
Name = "Test1",
Value = 255
},
new SampleData
{
Name = "Test2",
Value = 100
}
};

/// XMLファイルに書出し
XmlSerializeHelper.Save<List<SampleData>>( "test.xml", samples );

/// XMLファイルから読込み
List<SampleData> loadedSamples = XmlSerializeHelper.Load<List<SampleData>>( "test.xml" );

foreach ( SampleData data in loadedSamples )
{
Console.WriteLine( string.Format( "{0} {1}", data.Name, data.Value ) );
}

}
}

なおDictionaryをダンプするには、ISerializerインターフェイスを実装する独自クラスが必要。
こちらのサイトが参考になります。

0 件のコメント:

コメントを投稿