7

を使用して、HttpRuntime.Cacheセッション間で頻繁にアクセスするオブジェクトのリストを保存しています。

次のコード行を使用して、キャッシュからアイテムを取得します。

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

ただし、残念ながら、_chartDataを更新すると、キャッシュされたアイテムも更新されます。

キャッシュされたアイテムのコピーを簡単に取得するにはどうすればよいですか?

4

3 に答える 3

6

キャッシュは.NETのポインタを参照するだけなので、これが.NETの動作方法ですListchartData_Type値型か参照型かわからない。

値型の場合、次のように簡単に使用できます。

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

ただし、参照型の場合は複雑になります。クラスにDeepCopyDeepCopyメソッドを実装してから、リスト内のオブジェクトごとに実装する必要があります。

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();
于 2012-09-24T05:32:05.503 に答える
1

使用する:

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

_chartDataすべてのアイテムをからにコピーしますlist

于 2012-09-24T05:24:27.060 に答える
1

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

于 2012-09-24T05:31:32.390 に答える