以只读方式读取HttpRuntime.Cache项

时间:2012-09-24 05:19:41

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

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

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

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

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

如何获取缓存项目的副本?

3 个答案:

答案 0 :(得分:6)

这就是.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();

答案 1 :(得分:1)

使用:

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

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

答案 2 :(得分:1)

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