zoukankan      html  css  js  c++  java
  • .net关于应用程序缓存的一些疑惑

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

    首先是创建缓存的方法:

    /// <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# !

  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/New-world/p/3229015.html
Copyright © 2011-2022 走看看