【问题标题】:Read HttpRuntime.Cache item as read-only以只读方式读取 HttpRuntime.Cache 项
【发布时间】:2012-09-15 13:40:25
【问题描述】:

我正在使用HttpRuntime.Cache 来存储将在会话中频繁访问的对象列表。

我使用以下代码行从缓存中获取项目:

List<chartData_Type> _chartData = 
             (List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth");

但是,不幸的是,当我更新 _chartData 时,它也会更新缓存的项目。

我怎样才能简单地获取缓存项目的副本?

【问题讨论】:

    标签: c# asp.net .net caching httpruntime.cache


    【解决方案1】:

    这就是 .NET 的工作方式,因为 Cache 只是引用 List指针。不知道你chartData_Type是值类型还是引用类型。

    如果是值类型,那就好用了:

    List<chartData_Type> list = new List<chartData_Type>(_chartData);
    

    但是如果引用类型比较复杂,你需要为你的类实现DeepCopy方法,然后为列表中的每个对象做DeepCopy

    DeepClone方法:

    public static class CloneHelper
    {
        public static T DeepClone<T>(T obj)
        {
            using (var ms = new MemoryStream())
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(ms, obj);
                ms.Position = 0;
    
                return (T) formatter.Deserialize(ms);
            }
        }
    }
    

    为了使用这个方法,类chartData_Type必须标记为[Serializable]

    [Serializable]
    class chartData_Type
    {}
    

    所以,你可以手动进行深度克隆:

    var cloneChartData = _chartData.Select(d => 
                                           CloneHelper.DeepClone<chartData_Type>(d))
                            .ToList();
    

    【讨论】:

    【解决方案2】:

    用途:

    List<chartData_Type> list = new List<chartData_Type>(_chartData);
    

    它将所有项目从_chartData复制到list

    【讨论】:

    • 请注意,这将是对象的深层副本,因此您必须确保缓存和此副本保持同步,否则...... OOOOOPS!
    • 也许可以解释一下为什么他的副本也会更新缓存版本。会得到我的投票=P
    【解决方案3】:

    List 是一个引用类型,_chartData 保存存储在缓存中的原始对象的地址。这就是为什么当您更新 _chartData 时,它也会更新缓存的对象。如果您想要一个单独的对象,请克隆缓存的对象。见下文参考

    http://www.codeproject.com/Articles/33364/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca

    http://www.codeproject.com/Articles/45168/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2010-12-10
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多