delete from hateblo.jp where 1=1;

タイトルに意味はありません。

.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()]属性を定義する。