Search code examples
c#asp.net.netcachinghttpruntime.cache

Read HttpRuntime.Cache item as read-only


I am using a HttpRuntime.Cache to store a list of objects that will be accessing frequently across sessions.

I use the following line of code to get the item from the cache:

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

But, unfortunately when I update the _chartData, it updates the cached item too.

How can I simply get a copy of the cached item?


Solution

  • That is the way which .NET works because Cache just reference to the pointer of List. Don't know whether you chartData_Type is value type or reference type.

    If value type, it is easy to use:

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

    But if reference type, it comes to complicated, you need to implement DeepCopy method for your class, then do DeepCopy for each object in list.

    DeepClone method:

    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);
            }
        }
    }
    

    In order to use this method, class chartData_Type must be marked [Serializable]:

    [Serializable]
    class chartData_Type
    {}
    

    So, you can do deep clone manually:

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