天天看點

C#序列化與反序列化對象XML和JSON 詳細代碼工具

using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Xml;
using System.Runtime.Serialization.Json;
using System;

namespace cn.ava.PublicsUtil.Util
{
    /// <summary>
    /// 建立人Rex.liu
    /// 建立時間:2015年9月6日 14:48:29
    /// 功能:序列化反序列化XML檔案
    /// </summary>
    public class JsonAndXmlSerialization
    {
        #region 外部調用
        /// <summary>
        /// 将對象根據格式(XML/JSON)序列化成字元串結果
        /// </summary>
        /// <param name="o">目标對象</param>
        /// <param name="format">輸出格式</param>
        /// <returns></returns>
        public static string Serialize(object o, string format)
        {
            if (format.ToLower() == "xml")
            {
                return JsonAndXmlSerialization.XmlSerialize(o);
            }
            else
            {
                return JsonAndXmlSerialization.JsonSerialize(o);
            }
        }

        /// <summary>
        /// 将字元串根據格式(XML/JSON)反序列化成指定類型的對象
        /// </summary>
        /// <typeparam name="T">指定類型</typeparam>
        /// <param name="s">目标字元串</param>
        /// <param name="format">輸入格式</param>
        /// <returns></returns>
        public static T Deserialize<T>(string s, string format)
        {
            if (format.ToLower() == "xml")
            {
                return JsonAndXmlSerialization.XmlDeserialize<T>(s);
            }
            else
            {
                return JsonAndXmlSerialization.JsonDeserialize<T>(s);
            }
        }
        /// <summary>
        /// 對象序列化成檔案并儲存
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="t">對象實體</param>
        /// <param name="path">檔案路徑</param>
        /// <param name="format">格式:json或 xml</param>
        /// <returns></returns>
        public static bool SerializableFile<T>(object t, string path, string format)
        {
            if (format.ToLower() == "xml")
            {
                return JsonAndXmlSerialization.SerializableXML<T>(t, path);
            }
            else
            {
                return JsonAndXmlSerialization.SerializableJson<T>(t, path);
            }
        }
        /// <summary>
        /// 将檔案反序列化成對象
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="path">檔案路徑</param>
        /// <param name="format">格式: json 或 xml</param>
        /// <returns></returns>
        public static T DeserializeFile<T>(string path, string format)
        {
            if (format.ToLower() == "xml")
            {
                return JsonAndXmlSerialization.DeSerializableXML<T>(path);
            }
            else
            {
                return JsonAndXmlSerialization.DeSerializableJson<T>(path);
            }
        }
        #endregion

        #region 對象的序列化與反序列化
        /// <summary>
        /// 将object對象序列化成XML
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        private static string XmlSerialize(object o)
        {
            XmlSerializer ser = new XmlSerializer(o.GetType());
            System.IO.MemoryStream mem = new MemoryStream();
            XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8);
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            ser.Serialize(writer, o, ns);
            writer.Close();
            return Encoding.UTF8.GetString(mem.ToArray());
        }

        /// <summary>
        /// 字元串反序列化成對象
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="s">XML值</param>
        /// <returns></returns>
        private static T XmlDeserialize<T>(string s)
        {
            XmlDocument xdoc = new XmlDocument();
            try
            {
                xdoc.LoadXml(s);
                XmlNodeReader reader = new XmlNodeReader(xdoc.DocumentElement);
                XmlSerializer ser = new XmlSerializer(typeof(T));
                object obj = ser.Deserialize(reader);
                return (T)obj;
            }
            catch
            {
                return default(T);
            }
        }
        /// <summary>
        /// 對象序列化成Json字元串
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        private static string JsonSerialize(object o)
        {
            using (var ms = new MemoryStream())
            {
                new DataContractJsonSerializer(o.GetType()).WriteObject(ms, o);
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }
        /// <summary>
        /// Json字元串反序列化成對象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="s"></param>
        /// <returns></returns>
        private static T JsonDeserialize<T>(string s)
        {
            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(s)))
            {
                return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
            }
        }
        #endregion
        #region 将對象儲存成檔案
        /// <summary>
        /// 将對象儲存為json檔案
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="t">對象</param>
        /// <param name="path">儲存路徑</param>
        /// <returns></returns>
        private static bool SerializableJson<T>(object t, string path)
        {
            bool bl = false;
            try
            {
                string strjson = JsonSerialize(t);
                System.IO.StreamWriter sw = System.IO.File.CreateText(path);
                sw.WriteLine(strjson);
                sw.Close();
            }
            catch
            {
                return bl;
            }
            return true;
        }

        /// <summary>
        /// 将對象序列化成XML并儲存到檔案
        /// </summary>
        /// <returns></returns>
        private static bool SerializableXML<T>(object t, string path)
        {
            bool bl = false;
            FileStream fileStream = null;
            try
            {
                if (t != null)
                {
                    //建立xml格式器
                    XmlSerializer xmls = new XmlSerializer(typeof(T));
                    //建立檔案流
                    fileStream = new FileStream(path, FileMode.Create);
                    //将對象序列化到流
                    xmls.Serialize(fileStream, t);
                    bl = true;
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                }

            }

            return bl;
        }

        #endregion

        #region 将檔案反序列化成對象
        /// <summary>
        /// 将檔案反序列化json
        /// </summary>
        /// <typeparam name="T">類型</typeparam>
        /// <param name="path">json所存放的路徑</param>
        /// <returns>實體</returns>
        private static T DeSerializableJson<T>(string path)
        {
            T t = default(T);
            try
            {
                FileInfo fi = new FileInfo(path);

                if (fi.Exists)
                {
                    StreamReader sr = new StreamReader(path, Encoding.UTF8);
                    String line;
                    StringBuilder strcontent = new StringBuilder();
                    while ((line = sr.ReadLine()) != null)
                    {
                        strcontent.Append(line.ToString());
                    }
                    t = JsonAndXmlSerialization.JsonDeserialize<T>(strcontent.ToString());
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            return t;
        }

        /// <summary>
        /// 将檔案反序列化XML
        /// </summary>
        /// <typeparam name="T">類型</typeparam>
        /// <param name="path">XMl所存放的路徑</param>
        /// <returns>實體</returns>
        private static T DeSerializableXML<T>(string path)
        {
            T t = default(T);
            FileStream fileStream = null;
            try
            {
                XmlSerializer xmls = new XmlSerializer(typeof(T));
                FileInfo fi = new FileInfo(path);

                if (fi.Exists)
                {
                    fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                    t = (T)xmls.Deserialize(fileStream);
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                }
            }
            return t;
        }

        #endregion


    }
}