实体模型日志记录的两种方法
来源:互联网 发布:下载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(); }
- 实体模型日志记录的两种方法
- 记录数组数据到日志的两种方法
- 命名实体识别的两种方法
- Laravel两种记录日志的两种方式
- Hibernate继承关系的实体设计的两种方法
- Hibernate继承关系的实体设计的两种方法
- 清除SQLServer日志的两种方法
- 清除SQLServer日志的两种方法
- 清除SQLServer日志的两种方法
- 清除SQLServer日志的两种方法
- 清除SQLServer日志的两种方法
- 清除SQLServer日志的两种方法
- 清除SQLServer日志的两种方法
- SQLSERVER日志清除的两种方法
- SQLServer日志清除的两种方法
- 清除SQLServer日志的两种方法
- 清除SQLServer日志的两种方法
- [清除SQLServer日志的两种方法]
- js實現進度條
- IIS网站服务器性能优化指南
- 利用div+css在GridView模版列打造可定制的ToolTip风格
- 使用框架页面的跳转
- 利用div+css在GridView模版列打造可定制的ToolTip风格
- 实体模型日志记录的两种方法
- Linux下AT&T汇编语法格式简介
- Autodesk实习生笔试笔后感
- 用SOFTICE破解WINZIP的过程
- string与stringbuffer的区别
- JAVA IO 设计模式彻底分析
- [转]字符,字节和编码
- 2008 January 2nd Wednesday (一月 二日 水曜日)
- 金额小写转大写