Pregunta

estamos teniendo valores almacenados en la biblioteca Cache-Empresa de almacenamiento en caché de bloques. Los descriptores de acceso del elemento de la caché, que es una lista, modifique los valores. No queríamos los artículos en caché para que se vea afectado.

Por lo tanto primero que regresó una nueva lista (IEnumerator del CachedItem) Esto hizo descriptores de acceso seguro de agregar y eliminar elementos tuvieron poco efecto en el elemento de la caché originales.

Pero encontramos, todas las instancias de la lista volvimos a descriptores de acceso estaban vivos! Objeto relacional Gráfico mostró una relación entre esta lista y el EnterpriseLibrary.CacheItem.

Así que cambió el retorno a ser una lista recién clonado. Para ello se utilizó un LINQ decir (De elemento de datos seleccione nueva clase de datos (elemento)) .ToList () incluso cuando se hace que el anterior, los espectáculos ORG existe una relación entre esta lista y el CacheItem.

El canto nos hace nada para crear un clon del elemento de lista que está presente en la memoria caché de biblioteca de Enterprise, que tampoco tienen ninguna relación con caché?!

No hay solución correcta

Otros consejos

Se tendría que hacer una profunda clon de la lista, es decir, añadir un clon de cada objeto en la lista (y clonar objetos que pueden contener, sugeriría tener un método Clone () para hacer esto para usted ), a una nueva lista. Como se comentó anteriormente, una referencia es una referencia no importa cuántas veces se copia.

Esta es la forma en que clonar elementos cuando la sacan de la memoria caché. Los objetos tendrán que ser marcadas serializable.

        using (MemoryStream buffer = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(buffer, objectToClone);
            buffer.Position = 0;
            object temp = formatter.Deserialize(buffer);
            return temp;
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top