实体模型日志记录的两种方法

来源:互联网 发布:下载adp软件 编辑:程序博客网 时间:2024/05/04 13:35

在接口交互过程中或一步完整的提交之前通常需要记录下Request、Response的业务数据信息,当然前提是你通过实体类的方式存储了数据,如果不想一个个字段的方式去拼写日志格式,也不愿意在实体类内定义属性以记录特定关键的日志,可以通过以下两种方法来操作,大家都知道的,废话不多说。

§ 序列化

这里采用框架自带的序列化,当然你也可以采用诸如Newtonsoft的序列化组件,但原生态的序列化在日期类型字段为默认值时序列化会报错。
        /// <summary>        /// 序列化        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="obj"></param>        /// <param name="encoding"></param>        /// <returns></returns>        public static string Serialize<T>(T obj, Encoding encoding)        {            string retVal = string.Empty;            using (MemoryStream ms = new MemoryStream())            {                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));                serializer.WriteObject(ms, obj);                retVal = encoding.GetString(ms.ToArray());            }            return retVal;        }        /// <summary>        /// 反序列化        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="s"></param>        /// <param name="encoding"></param>        /// <returns></returns>        public static T Deserialize<T>(this string s, Encoding encoding) where T : class        {            //T obj = Activator.CreateInstance<T>();            using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))            {                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));                return serializer.ReadObject(ms) as T;            }        }


§ 反射

private static Dictionary<Type, List<MemberInfo>> ObjectCache = new Dictionary<Type, List<MemberInfo>>();        public static string GetObjectDetails(this object o, string spliter)        {            if (o == null)            {                return "NULL";            }            Type t = o.GetType();            ICollection ic = ObjectCache;            lock (ic.SyncRoot)            {                if (!ObjectCache.Keys.Contains(t))                {                    List<MemberInfo> mems = new List<MemberInfo>();                    PropertyInfo[] pros = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);                    foreach (PropertyInfo p in pros)                    {                        if (p.CanRead)                        {                            mems.Add(p);                        }                    }                    FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance);                    foreach (FieldInfo f in fields)                    {                        mems.Add(f);                    }                    //KeyValuePair<Type, List<MemberInfo>> kvp = new KeyValuePair<Type, List<MemberInfo>>(t, mems);                    ObjectCache.Add(t, mems);                }            }            StringBuilder sb = new StringBuilder();            ObjectCache[t].ForEach(tmp =>            {                FieldInfo f = tmp as FieldInfo;                if (f != null)                {                    object valueObject = f.GetValue(o);                    sb.Append(f.Name);                    sb.Append(":    ");                    sb.Append(valueObject);                    sb.Append(spliter);                }                else                {                    PropertyInfo p = tmp as PropertyInfo;                    if (p.CanRead)                    {                        sb.Append(p.Name);                        sb.Append(":    ");                        sb.Append(p.GetValue(o, null));                        sb.Append(spliter);                    }                }            });            return sb.ToString();        }