.Net Frameworkでのシリアライズ
対象
今日も以下のようなニッチな人向けにコードを投下。
- .NET Frameworkを使用している
- クラスをシリアライズしたい
- でも、ファイルとかあんまり使いたくない(メモリ上のみでシリアライズしたい)
実装クラス
using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Siri { static class Serializer { static public Encoding DefaultEncoding { get { return Encoding.Unicode; } } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> static public string Serialize<T>(T obj) { return Serialize<T>(obj, DefaultEncoding); } static public string Serialize<T>(T obj, Encoding Encoding) { if (obj == null) return string.Empty; var _sb = new System.Text.StringBuilder(); var _setting = new XmlWriterSettings(); _setting.Encoding = Encoding; using (var writer = System.Xml.XmlWriter.Create(_sb, _setting)) { var serializer = new XmlSerializer(typeof(T)); serializer.Serialize(writer, obj); } return _sb.ToString(); } static public T Deserialize<T>(string _data) { return Deserialize<T>(_data, DefaultEncoding); } static public T Deserialize<T>(string _data, Encoding Encoding) { if (string.IsNullOrEmpty(_data)) return default(T); try { using (var memoryStream = new MemoryStream(Encoding.GetBytes(_data.ToCharArray()))) using (var xml = XmlReader.Create(memoryStream)) { var serializer = new XmlSerializer(typeof(T)); if (!serializer.CanDeserialize(xml)) { return default(T); } var obj = serializer.Deserialize(xml); if (obj is T) { return (T)obj; } else { return default(T); } } } catch { return default(T); } } } }
gist 865605
ライセンスはPublic Domainとかにしておこう。
使い方
var cls = new SerializeableClass(); string selialized_text = Serializer.Serialize<SerializeableClass>(cls); //selialized_text にはシリアライズされたテキストが入る //逆に文字列からクラスを取得する場合は以下の通り SerializeableClass cls2 = Serializer.Deserialize<SerializeableClass>(selialized_text);
ファイルに吐き出す必要がないため、メモリ上で操作が出来る。
自前で作成したクラスをシリアライズしたい場合はclass HogeClassの前の行に[System.Serializable()]属性を定義する。