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

首先是创建缓存的方法:

/// <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. Java实现时间日期格式转换示例

    package com.hanqi.util; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...

  2. iOS 代码延迟执行

    1. [NSTread sleepForTimeInterval:0.8f] 这个方法 实际效果 好比打断点 等你再恢复断点执行 2.  [self performSelector:@selector ...

  3. bootstraptable的 showFooter属性

    如果想在表格最下面显示统计的信息可以使用这个属性  首先 先在表格加上这个属性 showFooter:true, 然后 在需要的列里面新增属性 footerFormatter  设置列的名称 然后在需 ...

  4. SpringCloud之Eureka高可用集群环境搭建

    注册中心集群 在微服务中,注册中心非常核心,可以实现服务治理,如果一旦注册出现故障的时候,可能会导致整个微服务无法访问,在这时候就需要对注册中心实现高可用集群模式. Eureka集群相当简单:相互注册 ...

  5. maven 相关插件

    maven打包配置,到底要打包哪些文件,如何配置??使用如下插件: <build> <finalName>weatherAdminSys</finalName> & ...

  6. castle windsor学习----- CastleComponentAttribute 特性注册

    [CastleComponent("GenericRepository", typeof(IRepository<>), Lifestyle = LifestyleTy ...

  7. Linux开发引导

    1.应用程序目录 /bin 用于存放启动系统时用到的程序 /usr/bin 用于存放用户使用的标准程序 /usr/local/bin 用于存放软件安装的程序 /sbin:/usr/sbin 用于存放系 ...

  8. Spark- Checkpoint原理剖析

    Checkpoint,是Spark 提供的一个比较高级的功能.有的时候,比如说,我们的 Spark 应用程序,特别的复杂,然后从初始的RDD开始,到最后拯个应用程序完成,有非常多的步骤,比如超过20个 ...

  9. linux 压缩和归档

    在linux下有几种压缩方式:gzip.bzip2.xz.zip gzip 压缩文件以.gz结尾, 只能压缩文件,不能压缩目录 用法: gzip:/path/to/somefile   用来压缩,完成 ...

  10. ES _all、_source的使用——_all字段连接所有字段的值构成一个用空格(space)分隔的大string而被analyzed和index,document主体保存在_source中

    1._all 1.1_all field _all字段是一个很少用到的字段,它连接所有字段的值构成一个用空格(space)分隔的大string,该string被analyzed和index,但是不被s ...