.net关于应用程序缓存的一些疑惑
2013-07-31 22:58
281 查看
疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥???
首先是创建缓存的方法:
获取缓存的方法:
开始使用缓存:
这个方法逻辑总没问题吧
接着来前台的代码:
下面的代码就省略了,就是获取一个实体对象,对比更改title后的原缓存值
第一个obj对象中的值如图:
这当然是正常的。
接着是更改title后的缓存对象的值:
我改的是Model中的值,但是缓存中title的值也变了,why???
引用类型数据? 我new了一个Model的对象还是这种结果!!!
最总解决方法是使用深复制拷贝一个新的model对象
解决步骤:
先建一个公共的处理类,用于深复制:
最后获取缓存的方法如下:
发现我根本就不懂C# !
首先是创建缓存的方法:
/// <summary> /// 创建缓存项过期 /// </summary> /// <param name="key">缓存Key</param> /// <param name="obj">object对象</param> /// <param name="expires">过期时间(分钟)</param> public static void Insert(string key, object obj, int expires) { HttpContext.Current.Cache.Insert(key, obj, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, expires, 0)); }
获取缓存的方法:
/// <summary> /// 获取缓存对象 /// </summary> /// <param name="key">缓存Key</param> /// <returns>object对象</returns> public static object Get(string key) { if (string.IsNullOrEmpty(key)) { return null; } return HttpContext.Current.Cache.Get(key); }
开始使用缓存:
/// <summary> /// 得到一个对象实体 /// </summary> public Model.article_news GetNewsModel(int id) { string key = "getmo" + id.ToString(); object objModel = CacheHelper.Get(key); if (objModel == null) { objModel = dal.GetNewsModel(id); if (objModel != null) { CacheHelper.Insert(key, objModel, 10); } } return (Model.article_news)objModel; }
这个方法逻辑总没问题吧
接着来前台的代码:
BLL.article bll = new BLL.article(); Model.article_news model = bll.GetNewsModel(_id); object obj = System.Web.HttpContext.Current.Cache.Get("getmo" + _id + ""); model.title = "222222222222222"; ddlCategoryId.SelectedValue = model.category_id.ToString(); object obj2 = System.Web.HttpContext.Current.Cache.Get("getmo" + _id + ""); txtTitle.Text = model.title;
下面的代码就省略了,就是获取一个实体对象,对比更改title后的原缓存值
第一个obj对象中的值如图:
这当然是正常的。
接着是更改title后的缓存对象的值:
我改的是Model中的值,但是缓存中title的值也变了,why???
引用类型数据? 我new了一个Model的对象还是这种结果!!!
最总解决方法是使用深复制拷贝一个新的model对象
解决步骤:
先建一个公共的处理类,用于深复制:
#region 引用数据类型深复制 /// <summary> /// 引用数据类型深复制 /// </summary> /// <typeparam name="T">数据类型</typeparam> /// <param name="serializableObject">要复制的范本</param> /// <returns>返回拷贝后的新对象</returns> public static T CloneOf<T>(T serializableObject) { object objCopy = null; MemoryStream stream = new MemoryStream(); BinaryFormatter binFormatter = new BinaryFormatter(); binFormatter.Serialize(stream, serializableObject); stream.Position = 0; objCopy = (T)binFormatter.Deserialize(stream); stream.Close(); return (T)objCopy; } #endregion
最后获取缓存的方法如下:
/// <summary> /// 得到一个对象实体 /// </summary> public Model.article_news GetNewsModel(int id) { string key = "getmo" + id.ToString(); object objModel = CacheHelper.Get(key); if (objModel == null) { objModel = dal.GetNewsModel(id); if (objModel != null) { CacheHelper.Insert(key, objModel, 10); } } Model.article_news model = (Model.article_news)objModel; Model.article_news model2 = Utils.CloneOf<Model.article_news>(model); return model2; }
发现我根本就不懂C# !
相关文章推荐
- 关于提高.net应用程序效率的一些经验总结(转)
- 关于提高.net应用程序效率的一些经验总结
- 关于.net的一些资源网站
- 关于Metro style下可用的.net类库的一些概要说明
- 安卓中关于图片从网络获取,压缩,上传,下载,缩略图,缓存的一些处理总结(二)
- 关于.net 中XML解析 的一些链接
- 关于缓存的一些问题!请大牛指点!
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 关于.NET中一些模块的看法
- 关于.net中获取图像缩略图的函数GetThumbnailImage的一些认识。
- 关于模板缓存的一些试验
- 关于.net的一些资源网站
- 关于今天笔试关于java一些基础题的疑惑
- 关于linux下内存使用的一些疑惑[转载]
- 关于.net的一些免费课程
- 一起谈.NET技术,关于CLR内存管理一些深层次的讨论 [上篇]
- >>关于.NET CF 的一些知识——启动同一个程序的多个拷贝
- 关于.net中获取图像缩略图的函数GetThumbnailImage的一些认识。
- 关于 .net 开发 Office Word 的一些问题小结
- 安卓中关于图片从网络获取,压缩,上传,下载,缩略图,缓存的一些处理总结(三)