エンジニアの備忘録

エンジニアの私が備忘録や思ったことをちょいちょい書いてます。

C# Tips-シリアライズとデシリアライズ

シリアライズとデシリアライズは割と使うけど、
よく忘れるので備忘録。

シリアライズメソッド

public static void Save<T>(T ob, string path)
{
    XmlSerializer xs = new XmlSerializer(typeof(T));
    using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8))
    {
        xs.Serialize(sw, ob);
        sw.Flush();
    }
}

Tを使うことでどんなクラスでも簡単にシリアライズできます。

シリアライズメソッド

public static T Load<T>(string path)
{
    if(!File.Exists(path))
    {
        return default(T);
    }
    XmlSerializer xs = new XmlSerializer(typeof(T));
    T result;
    XmlReaderSettings xrs = new XmlReaderSettings()
    {
        CheckCharacters = false,
    };
    using (StreamReader sr = new StreamReader(path, Encoding.UTF8))
    {
        using (XmlReader xr = XmlReader.Create(sr, xrs))
        {
            result = (T)xs.Deserialize(xr);
        }
    }
    return result;
}

こちらもTを使うことでどんなクラスでもデシリアライズできます。

staticクラスにする

これらをstaticクラスにすればとても使いやすいクラスになります。

    public static class Serializer
    {
        public static void Save<T>(T ob, string path)
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8))
            {
                xs.Serialize(sw, ob);
                sw.Flush();
            }
        }

        public static T Load<T>(string path)
        {
            if(!File.Exists(path))
            {
                return default(T);
            }

            XmlSerializer xs = new XmlSerializer(typeof(T));
            T result;

            XmlReaderSettings xrs = new XmlReaderSettings()
            {
                CheckCharacters = false,
            };
            using (StreamReader sr = new StreamReader(path, Encoding.UTF8))
            {
                using (XmlReader xr = XmlReader.Create(sr, xrs))
                {
                    result = (T)xs.Deserialize(xr);
                }
            }

            return result;
        }
    }