我正在使用 aHttpRuntime.Cache
来存储将在会话中频繁访问的对象列表。
我使用以下代码行从缓存中获取项目:
List<chartData_Type> _chartData =
(List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth");
但是,不幸的是,当我更新_chartData时,它也会更新缓存的项目。
我怎样才能简单地获取缓存项目的副本?
我正在使用 aHttpRuntime.Cache
来存储将在会话中频繁访问的对象列表。
我使用以下代码行从缓存中获取项目:
List<chartData_Type> _chartData =
(List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth");
但是,不幸的是,当我更新_chartData时,它也会更新缓存的项目。
我怎样才能简单地获取缓存项目的副本?
这就是 .NET 的工作方式,因为 Cache 只引用 .NET的指针。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();
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
利用:
List<chartData_Type> list = new List<chartData_Type>(_chartData);
它会将所有项目从 复制_chartData
到list
。