Клонированный кешированный объект имеет проблемы с памятью - PullRequest
1 голос
/ 30 марта 2010

у нас есть значения, хранящиеся в Cache-Enterprise библиотеке Cache-Enterprise. Средства доступа к кешированному элементу, который является списком, изменяют значения. Мы не хотели, чтобы кэшированные элементы были затронуты.

Следовательно, сначала мы вернули новый список (IEnumerator из CachedItem) Это сделало так, что добавители и добавление и удаление элементов оказали незначительное влияние на исходный элемент Cached.

Но мы обнаружили, что все экземпляры Списка, которые мы вернули аксессорам, были ЖИВЫМИ! Объект реляционного Графа показал связь между этим списком и EnterpriseLibrary.CacheItem.

Таким образом, мы изменили возвращение, чтобы быть вновь клонированным списком. Для этого мы использовали LINQ сказать (из элемента в Data выберите новый DataClass (элемент)) .ToList () даже если вы делаете, как указано выше, ORG показывает, что есть связь между этим списком и CacheItem.

Не можем ли мы что-нибудь сделать, чтобы создать клон элемента List, который присутствует в кэше библиотеки Enterprise, который НЕ имеет ЛЮБОЙ связи с CACHE?

Ответы [ 2 ]

1 голос
/ 30 марта 2010

Вы должны будете сделать глубокий клон списка, т.е. добавить клон каждого объекта в списке (и клонировать любые объекты, которые они могут содержать, я бы предложил использовать метод Clone (), чтобы сделать это для вас ), в новый список. Как было сказано выше, ссылка - это ссылка, независимо от того, сколько раз вы ее копируете.

0 голосов
/ 14 февраля 2014

Вот как мы клонируем предметы, когда вытаскиваем их из кеша Объекты должны быть помечены как сериализуемые.

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