疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥???

首先是创建缓存的方法:

/// <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(, expires, ));
}

获取缓存的方法:

/// <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 = ;
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关于应用程序缓存的一些疑惑的更多相关文章

  1. HTML 5 应用程序缓存manifest

    什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏 ...

  2. HTML5应用程序缓存Application Cache

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  3. HTML 5 应用程序缓存(下)

    Manifest 文件manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容). manifest 文件可分为三个部分: CACHE MANIFEST - 在此标题下列出的 ...

  4. HTML 5 应用程序缓存(上)

    什么是应用程序缓存(Application Cache)?HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏览 ...

  5. 应用程序缓存--manifest

    应用程序缓存(Application Cache)为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载得更快 减少服务器负载 - 浏览器将只从服务器下载更新过或更改 ...

  6. Manifesto – HTML5 离线应用程序缓存校验工具

    Manifesto 是一个 HTML5 离线应用程序缓存校验工具,提供了快速校验 HTML5 manifest 文件有效性的方法.离线应用程序缓存在使用中最困难的部分之一就是无法正常工作的时候没有明显 ...

  7. 【HTML5】浅析HTML5应用程序缓存(ApplicationCache)

    一.为什么需要Web应用程序缓存 在移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐在火车上,过了一个隧道(15分钟),便无法访问网站,这对于web的伤害是很大的    ...

  8. HTML5应用程序缓存Application Cache详解

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  9. HTML 5 应用程序缓存

    使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这 ...

随机推荐

  1. Redis QPS测试

    1.计算qps: 1)redis发布版本中自带了redis-benchmark性能测试工具,可以使用它计算qps.示例:使用50个并发连接,发出100000个请求,每个请求的数据为2kb,测试host ...

  2. c++ 之重要性

    c++的功能比c语言大的多,c语言偏最底层,且程序短小,而对于一个大的系统,用c++,因为它具备了c语言的优点. 很多学嵌入式的觉得学了c语言之后,就不用学c++了,会认为c++很简单,然而,c++并 ...

  3. Data Structure Linked List: Reverse a Linked List in groups of given size

    http://www.geeksforgeeks.org/reverse-a-list-in-groups-of-given-size/ #include <iostream> #incl ...

  4. HDU 2736 Surprising Strings

                                    Surprising Strings Time Limit:1000MS     Memory Limit:65536KB     64 ...

  5. 关于mysql使用索引的一个问题

    mysql一直号称是免维护的,但是我发现它往往连最表基本索引都不能自动维护,情景如下: 1.我用mysqldump导出一个大表longformh; 2.用mysql.exe导入到一个新库中: 3.查看 ...

  6. Bootstrap(二)段落+强调内容

    在Bootstrap中为文本设置了一个全局的文本样式(这里所说的文本是指正文文本): 1.全局文本字号为14px(font-size). 2.行高为1.42857143(line-height),大约 ...

  7. hdu 3308 线段树 区间合并+单点更新+区间查询

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. spring学习(1)

    struts是web框架(jsp/action/action) hibernate是orm框架,处于持久层. spring是一个框架,是容器框架.用于配置bean,并维护bean之间关系的一种框架. ...

  9. Tomcat翻译--Tomcat Web Application Deployment(Tomcat中部署web应用)

    原文:http://tomcat.apache.org/tomcat-7.0-doc/deployer-howto.html Introduction(介绍) Deployment is the te ...

  10. Sed 命令详解 正则表达式元字符

    1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...