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

首先是创建缓存的方法:

/// <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. nc传文件

    nc传文件 先启动接收方 nc -l -p 9999 > index.lua 后启动发送方 nc 192.168.1.1 9999 < index.lua

  2. 分析DNS解析时间

    提高网页的打开速度,一般地我们会选择使用CDN,利用“就近原则”让用户在最短的时间内获取到服务器资源,实际应用当中采用CDN的方式提高网站访问速度的效果也是最明显的.这也就是为什么国外的空间打开速度远 ...

  3. 1django 视图与网址

    创建一个项目,名字叫mysite django-admin startproject mysite(项目名) 成功后,看到如下样式 mysite ├── manage.py └── mysite ├─ ...

  4. 0424 collections模块、time模块、rondom模块、sys模块

    昨日回顾:hashlib 摘要 md5 sha系列 文件的一致性校验 密文的认证 logging 记录日志 两种用法 basicConfig不常用 getLogger()常用 可以通过一个参数去控制全 ...

  5. 多图切换jQuery图片滑块插件

    在线演示 本地下载

  6. android HDMI (一):HDMI基础篇【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7713450 说到android的HDMI,从android 2.2.android2. ...

  7. Spring Cloud之服务治理(注册发现)

    服务治理SpringCloud Eureka 什么是服务治理 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容 ...

  8. linux ps aux 结果解释

    # ps aux | moreUSER       PID  %CPU   %MEM   VSZ    RSS    TTY                   STAT       START    ...

  9. NTFS文件系统的主要优点体现在以下三个方面

    1.NFTS格式具有用户权限的控制管理功能 2.NTFS有更好的压缩率 3.NTFS具有日志功能,可以提高系统安全性

  10. ubantu删除文件(夹)

    格式:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除 -f 就是直接强行删除,不作任何提示的意思 名称 rm - 移除文件或者目录 概述 rm [选项]... 文件列表... ...