Frage Lies HttpRuntime.Cache als schreibgeschützt


Ich benutze ein HttpRuntime.Cache um eine Liste von Objekten zu speichern, auf die während Sitzungen häufig zugegriffen wird.

Ich verwende die folgende Codezeile, um das Element aus dem Cache zu erhalten:

List<chartData_Type> _chartData = 
             (List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth");

Aber leider, wenn ich das aktualisiere _chartDatenEs aktualisiert das zwischengespeicherte Objekt auch.

Wie kann ich einfach eine Kopie des zwischengespeicherten Artikels erhalten?


7
2017-09-24 05:19


Ursprung


Antworten:


Das ist die Art und Weise, wie .NET funktioniert, weil Cache sich nur auf die Zeiger von List. Ich weiß nicht, ob du es bist chartData_Type ist Werttyp oder Referenztyp.

Wenn Werttyp, ist es einfach zu verwenden:

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

Aber wenn Referenztyp, es kommt zu kompliziert, müssen Sie implementieren DeepCopy Methode für Ihre Klasse, dann tun DeepCopy für jedes Objekt in der Liste.

DeepClone Methode:

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);
        }
    }
}

Um diese Methode zu verwenden, Klasse chartData_Type muss markiert sein [Serializable]:

[Serializable]
class chartData_Type
{}

Sie können also manuell einen tiefen Klon erstellen:

var cloneChartData = _chartData.Select(d => 
                                       CloneHelper.DeepClone<chartData_Type>(d))
                        .ToList();

6
2017-09-24 05:32



Benutzen:

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

Es kopiert alle Objekte von _chartData zu list.


1
2017-09-24 05:24



Liste ist ein Referenztyp und _chartData enthält die Adresse des ursprünglichen Objekts, das im Cache gespeichert ist. Aus diesem Grund wird beim Aktualisieren von _chartData auch das zwischengespeicherte Objekt aktualisiert. Wenn Sie ein separates Objekt benötigen, klonen Sie das zwischengespeicherte Objekt. Siehe unten

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


1
2017-09-24 05:31