Read HttpRuntime.Cache item as read-only

試著忘記壹切 提交于 2019-12-01 01:11:47

问题


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?


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



回答2:


Use:

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

It will copy all items from _chartData to list.




回答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



来源:https://stackoverflow.com/questions/12559219/read-httpruntime-cache-item-as-read-only

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!