克隆缓存项目存在内存问题

时间:2010-03-30 04:43:48

标签: .net caching enterprise generic-list

我们将值存储在Cache-Enterprise库缓存块中。缓存项的访问者(List)修改值。 我们不希望缓存的项目受到影响。

因此首先我们返回一个新的List(CachedItem的IEnumerator) 这确保了添加和删除项目的访问者对原始缓存项目几乎没有影响。

但是我们发现,我们返回给访问者的List的所有实例都是ALIVE!对象关系图显示了此列表与EnterpriseLibrary.CacheItem之间的关系。

因此我们将返回更改为新克隆的List。为此,我们使用了LINQ 说 (来自Data中的项目选择新的DataClass(item))。ToList() 即使您按上述方式执行操作,ORG也会显示此列表与CacheItem之间存在关系。

我们不能做任何事情来创建List项目的CLONE,它存在于企业库缓存中,DOESNT与CACHE有任何关系吗?!

2 个答案:

答案 0 :(得分:1)

您必须对列表进行深度克隆,即在列表中添加每个对象的克隆(并克隆它们可能包含的任何对象,我建议使用Clone()方法为您执行此操作),到一个新的清单。如上所述,无论您复制多少次,引用都是引用。

答案 1 :(得分:0)

这是我们在将项目拉出缓存时克隆项目的方法。必须将对象标记为可序列化。

        using (MemoryStream buffer = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(buffer, objectToClone);
            buffer.Position = 0;
            object temp = formatter.Deserialize(buffer);
            return temp;
        }