.NET序列化、反序列化,包含XML、JSON、二进制

(一、)序列化类:JSON用的反射调用;

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Xml.Serialization;

namespace CommonHelper
{
    /// <summary>
    /// 序列化操作类
    /// Json、XML、二进制序列化反序列化
    /// </summary>
    public class SerializeConverter
    {

        #region JSON序列化
        private static Type TypeJosnClass;

        private static object objLock=new object();

        /// <summary>
        /// 序列化为JSON字符串
        /// </summary>
        /// <param name="obj">对象实体</param>
        /// <returns></returns>
        public static string SerializeObjectToJson(object obj)
        {
            try
            {
                MethodInfo mt = CreateJosnClass().GetMethod("SerializeObject", new Type[] { typeof(object) });

                object[] param = new object[1] { obj };
                object rt = mt.Invoke(null, param);

                if (rt != null)
                {
                    return rt.ToString();
                }
                else
                {
                    return "";
                }
            }
            catch(Exception ex)
            {
                Log.SaveExceptionLog("序列化为JSON字符串失败:", ex);
                return "";
            }

        }

        /// <summary>
        /// 反序列化JSON为对象
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="json">JSON字符串</param>
        /// <returns></returns>
        public static T DeSerializeFromJson<T>(string json) where T : class
        {
            try
            {
                MethodInfo mt = CreateJosnClass().GetMethod("DeserializeObject", new Type[] { typeof(string), typeof(Type) });
                object[] param = new object[2] { json, typeof(T) };

                object rt = mt.Invoke(null, param);
                if (rt == null)
                {
                    return default(T);
                }
                else
                {
                    return (T)rt;
                }
            }
            catch (Exception ex)
            {
                Log.SaveExceptionLog("反序列化JSON为对象:", ex);
                return null;
            }


        }

        private static Type CreateJosnClass()
        {
            if (TypeJosnClass == null)
            {
                lock (objLock)
                {
                    var tp = ReflexHelper.CreateClassType("Newtonsoft.Json.dll", "Newtonsoft.Json.JsonConvert");
                  
                    TypeJosnClass = tp;
                }
            }
            return TypeJosnClass;

        }
        #endregion JSON序列化

        #region XML序列化
        /// <summary>
        /// XML反序列化
        /// </summary>
        public static T DeSerializeFromXML<T>(string strXML) where T : class
        {
            try
            {
                using (StringReader sr = new StringReader(strXML))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    return serializer.Deserialize(sr) as T;
                }
            }
            catch (Exception ex)
            {
                Log.SaveExceptionLog("XML反序列化:", ex);
                return null;
            }
        }

        /// <summary>
        /// XML序列化
        /// 序列化的类必须标记为[[Serializable]]
        /// </summary>
        /// <typeparam name="T">泛型类型</typeparam>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        public static string SerializeObjectToXML<T>(T obj)
        {
            using (StringWriter sw = new StringWriter())
            {
                Type t = obj.GetType();
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(sw, obj);
                sw.Close();
                return sw.ToString();
            }
        }

        /// <summary>
        /// XML序列化
        /// 序列化的类必须标记为[[Serializable]]
        /// </summary>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        public static string SerializeObjectToXML(object obj)
        {
            //using (StringWriter sw = new StringWriter())
            //{
            //    Type t = obj.GetType();
            //    XmlSerializer serializer = new XmlSerializer(obj.GetType());
            //    serializer.Serialize(sw, obj);
            //    sw.Close();
            //    return sw.ToString();
            //}
            MemoryStream Stream = new MemoryStream();
            XmlSerializer xml = new XmlSerializer(obj.GetType());
            try
            {
                //序列化对象
                xml.Serialize(Stream, obj);
            }
            catch (InvalidOperationException)
            {
                throw;
            }
            Stream.Position = 0;
            StreamReader sr = new StreamReader(Stream);
            string str = sr.ReadToEnd();

            sr.Dispose();
            Stream.Dispose();

            return str;
        }
        #endregion XML序列化

        #region 二进制序列化
        /// <summary>
        /// 二进制序列化
        /// 序列化的类必须标记为[[Serializable]]
        /// </summary>
        /// <param name="request">对象实体</param>
        /// <returns></returns>
        public static byte[] SerializeObjectToBinary(object request)
        {

            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer =

            new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

            using (System.IO.MemoryStream memStream = new System.IO.MemoryStream())
            {
                serializer.Serialize(memStream, request);

                return memStream.ToArray();
            }
        }

        /// <summary>
        /// 二进制反序列化
        /// </summary>
        /// <param name="data">二进制数据</param>
        /// <returns></returns>
        public static object DeSerializeFromBinary(byte[] data)
        {
            using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(data))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializer =

                new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

                return deserializer.Deserialize(memStream);
            }
        }

        #endregion 二进制序列化

    }

    

反射操作类:

/// <summary>
    /// 反射调用类
    /// 用于反射类型、属性、静态方法、实例方法等
    /// </summary>
    public class ReflexHelper
    {
        /// <summary>
        /// 类型缓存
        /// </summary>
        public static Dictionary<string, Type> TypesCache = new Dictionary<string, Type>();

        private static object Lockobj = new object();

        #region 反射类型type、类calss
        /// <summary>
        /// 反射创建类型
        /// </summary>
        /// <param name="assmPath">dll程序集路径 XXX.dll widget\xxx.dll</param>
        /// <param name="className">类名全称 Newtonsoft.Json.JsonConvert JHNIS.JHNISCommonLib.CommonHelper.ReflexHelper</param>
        /// <returns></returns>
        public static Type CreateClassType(string assmPath, string className)
        {
            string key = assmPath + "|" + className;
            try
            {
                if (TypesCache.ContainsKey(key) == false)
                {
                    lock (Lockobj)
                    {
                        var assm = Assembly.LoadFrom(GetBasePath() + assmPath);
                        var tp = assm.GetType(className);
                        if(tp==null)
                        {
                           Log.SaveLog("反射创建类型失败:" + GetBasePath() + assmPath + " class:"+ className);
                        }
                        TypesCache[key] = tp;
                    }
                }
                
                return TypesCache[key];
            }
            catch (Exception ex)
            {
                Log.SaveExceptionLog("反射创建类型失败:" + key, ex);
                return null;
            }
        }

        /// <summary>
        /// 获取基本路径
        /// 客户端,启动程序的根目录
        /// WEB bin目录
        /// </summary>
        /// <returns></returns>
        public static string GetBasePath()
        {
            string strPath = "";
            if (System.Web.HttpContext.Current != null )
            {
                //web程序部署物理地址
                strPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "\\bin\\";
            }
            else
            {
                //winform\WCF\exe\windows服务
                strPath = System.AppDomain.CurrentDomain.BaseDirectory + "\\";
            }

            Log.SaveLog(string.Format("获取基本路径:base:{0} web:{1} log:{2}", System.AppDomain.CurrentDomain.BaseDirectory, System.Web.HttpContext.Current, JHNISCommonManage.GetInstance().Log.logPath));
            return strPath;
        }

        /// <summary>
        /// 反射类实体
        /// </summary>
        /// <param name="assmPath">dll程序集路径</param>
        /// <param name="className">类名全称</param>
        /// <returns></returns>
        public static object CreateClassObject(string assmPath, string className)
        {
            try
            {
                Type type = CreateClassType(assmPath, className);
                if (type == null)
                {
                    return null;
                }
                object obj = Activator.CreateInstance(type);
                if(obj==null)
                {
                    Log.SaveLog("反射实体创建失败:assmPath "+ assmPath +" className:"+ className);
                }
                return obj;
            }
            catch (Exception ex)
            {
                Log.SaveExceptionLog("反射创建类失败:" + assmPath + " " + className, ex);
                return null;
            }
        }

        /// <summary>
        /// 反射类实体
        /// </summary>
        /// <param name="assmPath">dll程序集路径</param>
        /// <param name="className">类名全称</param>
        /// <returns></returns>
        public static T CreateClassObject<T>(string assmPath, string className)
        {
            object obj = CreateClassObject(assmPath, className);
            if (obj != null)
            {
                return (T)obj;
            }
            else
            {
                return default(T);
            }
        }
        #endregion 反射类型type、类calss

        #region 反射调用-静态方法
        /// <summary>
        /// 反射类的静态方法
        /// </summary>
        /// <param name="assmPath">dll程序集路径 XXX.dll widget\xxx.dll</param>
        /// <param name="className">类名全称 Newtonsoft.Json.JsonConvert JHNIS.JHNISCommonLib.CommonHelper.ReflexHelper</param>
        /// <param name="methodName">方法名</param>
        /// <param name="paramValues">参数列表</param>
        /// <returns></returns>
        public static object ExcuteStaticMethod(string assmPath, string className, string methodName, object[] paramValues)
        {
            return ExcuteStaticMethod(assmPath, className, methodName, paramValues, null);
        }

        /// <summary>
        /// 反射类的静态方法(带参数类型)
        /// 重载方法,需要传参数类型来确定是哪个重载
        /// </summary>
        /// <param name="assmPath">dll程序集路径 XXX.dll widget\xxx.dll</param>
        /// <param name="className">类名全称 Newtonsoft.Json.JsonConvert JHNIS.JHNISCommonLib.CommonHelper.ReflexHelper</param>
        /// <param name="methodName">方法名</param>
        /// <param name="paramValues">参数列表</param>
        /// <param name="paramTypes">参数类型列表,重载方法,需要传参数类型来确定是哪个重载</param>
        /// <returns></returns>
        public static object ExcuteStaticMethod(string assmPath, string className, string methodName, object[] paramValues, Type[] paramTypes)
        {

            Type type = CreateClassType(assmPath, className);
            if (type == null)
            {
                JHNISCommonManage.GetInstance().Log.SaveLog(string.Format("反射方法Type失败:dll:{0} class:{1} method:{2}", assmPath, className, methodName));
                return null;
            }

            return ExcuteStaticMethod(type, methodName, paramValues, paramTypes);

        }

        /// <summary>
        /// 反射类的静态方法
        /// </summary>
        /// <param name="type">类型</param>
        /// <param name="methodName">方法名</param>
        /// <param name="paramValues">参数列表</param>
        /// <param name="paramTypes">参数类型列表 重载方法,需要传参数类型来确定是哪个重载 无重载的传null</param>
        /// <returns></returns>
        public static object ExcuteStaticMethod(Type type, string methodName, object[] paramValues, Type[] paramTypes)
        {
            string assmPath = type.Assembly.FullName;
            string className = type.FullName;

            try
            {
                MethodInfo mt;
                if (paramTypes != null)
                {
                    mt = type.GetMethod(methodName, paramTypes);
                }
                else
                {
                    mt = type.GetMethod(methodName);
                }

                object rt = mt.Invoke(null, paramValues);

                return rt;
            }
            catch (Exception ex)
            {
                JHNISCommonManage.GetInstance().Log.SaveExceptionLog(string.Format("反射Static方法失败:dll:{0} class:{1} method:{2}", assmPath, className, methodName), ex);
                return null;
            }
        }

        #endregion 反射调用-静态方法

        #region 反射调用-实例方法
        /// <summary>
        /// 反射实体方法
        /// </summary>
        /// <param name="obj">类实例</param>
        /// <param name="methodName"></param>
        /// <param name="paramValues"></param>
        /// <returns></returns>
        public static object ExecuteObjectMethod(object obj,string methodName,object[] paramValues)
        {
            return ExecuteObjectMethod(obj, methodName, paramValues, null);

        }

        /// <summary>
        /// 反射实体方法(重载方法)
        /// </summary>
        /// <param name="obj">类实例</param>
        /// <param name="methodName"></param>
        /// <param name="paramValues"></param>
        /// <param name="paramTypes">参数类型列表 重载方法,需要传参数类型来确定是哪个重载 无重载的传null</param>
        /// <returns></returns>
        public static object ExecuteObjectMethod(object obj, string methodName, object[] paramValues,Type[] paramTypes)
        {
            try
            {
                if(obj==null)
                {
                    Log.SaveLog("反射实体方法失败:实体创建失败 = null 方法名:"+methodName);
                    return null;
                }
                MethodInfo mt=null;
                try
                {
                    if (paramTypes != null)
                    {
                        mt = obj.GetType().GetMethod(methodName, paramTypes);
                        if (mt == null)
                        {
                            mt = obj.GetType().GetMethod(methodName);
                        }
                    }
                    else
                    {
                        mt = obj.GetType().GetMethod(methodName);
                    }
                }
                catch (Exception ex)
                {
                    Log.SaveExceptionLog(string.Format("反射实体方法失败 GetMethod:class:{0} method:{1}", obj.GetType().FullName, methodName), ex);
                }

               
                if (mt == null)
                {
                    foreach (MethodInfo m in obj.GetType().GetMethods())
                    {
                        //JHNISCommonManage.GetInstance().Log.SaveLog("类:" + obj.GetType().FullName + " 方法:" + methodName);
                        if (m.Name == methodName)
                        {
                            mt = m; 
                        }
                    }
                    if(mt==null)
                    {
                        throw new Exception("找不到方法:类:" + obj.GetType().FullName +" 方法:"+ methodName);
                    }
                  
                }
                object rt = mt.Invoke(obj, paramValues);
                return rt;
            }
            catch (Exception ex)
            {
                Log.SaveExceptionLog(string.Format("反射实体方法失败 Exception:class:{0} method:{1}", obj.GetType().FullName, methodName), ex);
                return null;
            }

        }
        #endregion 反射调用-实例方法

        #region 反射属性-静态
        /// <summary>
        /// 获取-静态类属性
        /// </summary>
        /// <param name="assmPath"></param>
        /// <param name="className"></param>
        /// <param name="pName"></param>
        /// <returns></returns>
        public static object GetStaticPropertyValue(string assmPath, string className, string pName)
        {
            Type type = CreateClassType(assmPath, className);
            if (type != null)
            {
                return GetStaticPropertyValue(type, pName);
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// 获取-静态类属性
        /// </summary>
        /// <param name="type"></param>
        /// <param name="pName"></param>
        /// <returns></returns>
        public static object GetStaticPropertyValue(Type type, string pName)
        {
            PropertyInfo p = type.GetProperty(pName);
            if (p == null)
            {
                //日志
                Log.SaveLog("反射获取-静态属性失败:" + type + " 属性:" + pName);
                return null;
            }
            else
            {
                return p.GetValue(null, null);
            }
        }

        /// <summary>
        /// 设置-静态类属性
        /// </summary>
        /// <param name="assmPath"></param>
        /// <param name="className"></param>
        /// <param name="pName"></param>
        /// <param name="vl"></param>
        public static void SetStaticPropertyValue(string assmPath, string className, string pName, object vl)
        {
            Type type = CreateClassType(assmPath, className);
            if (type != null)
            {
                SetStaticPropertyValue(type, pName, vl);
            }
        }

        /// <summary>
        /// 设置-静态类属性
        /// </summary>
        /// <param name="type"></param>
        /// <param name="pName"></param>
        /// <param name="vl"></param>
        public static void SetStaticPropertyValue(Type type, string pName, object vl)
        {
            PropertyInfo p = type.GetProperty(pName);
            if (p == null)
            {
                //日志
                Log.SaveLog("反射设置-静态属性失败:" + type + " 属性:" + pName);
            }
            else if (p.PropertyType != vl.GetType())
            {
                //日志
                Log.SaveLog("反射设置-静态属性失败-属性值类型不符:" + type + " 属性:" + pName + " 属性类型:" + vl.GetType());
            }
            else
            {
                p.SetValue(null, vl, null);
            }
        }
        #endregion 反射属性-静态

        #region 反射属性-实例

        /// <summary>
        /// 获取-实例类属性
        /// </summary>
        /// <param name="obj">类实例</param>
        /// <param name="pName">属性名称</param>
        /// <returns></returns>
        public static object GetObjectPropertyValue(object obj,string pName)
        {
            PropertyInfo p = obj.GetType().GetProperty(pName);
            if(p==null)
            {
                var finfo = obj.GetType().GetField(pName);
                if(finfo==null)
                {
                    //日志
                    Log.SaveLog("反射获取实例属性失败,无此属性/字段:" + obj.GetType() + " 属性:" + pName);
                    return null;
                }
                else
                {
                    return finfo.GetValue(obj);
                }
              
            }
            else
            {
                return p.GetValue(obj, null);
            }
        }

        /// <summary>
        /// 设置-实例类属性
        /// </summary>
        /// <param name="obj">类实例</param>
        /// <param name="pName">属性名称</param>
        /// <param name="vl">属性值</param>
        public static void SetObjectPropertyValue(object obj, string pName, object vl)
        {
            PropertyInfo p = obj.GetType().GetProperty(pName);
            if (p == null)
            {
                //日志
                Log.SaveLog("反射设置实例属性失败:" + obj.GetType() + " 属性:" + pName);
            }
            else if(p.PropertyType != vl.GetType())
            {
                //日志
                Log.SaveLog("反射设置实例属性失败-属性值类型不符:" + obj.GetType() + " 属性:" + pName+ " 属性类型:" + vl.GetType());
            }
            else
            {
                p.SetValue(obj, vl, null);
            }
        }
        #endregion 反射属性-实例
    }
}