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?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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

Method 2

Use:

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

It will copy all items from _chartData to list.

Method 3

List is a reference type and _chartData holds the address of the original object stored in the cache. That is why when you update _chartData, it updates the cached object too. If you want a separate object then clone the cached object. See below reference

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x