Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 884
Libin TK Avatar asked Sep 24 '12 05:09

Libin TK


2 Answers

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();
like image 192
cuongle Avatar answered Oct 02 '22 12:10

cuongle


Use:

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

It will copy all items from _chartData to list.

like image 25
Kirill Polishchuk Avatar answered Oct 02 '22 13:10

Kirill Polishchuk