疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥???
首先是创建缓存的方法:
/// <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# !