如何在 C# 中通过克隆对象进行内存缓存

How to do memory cache with Cloning of object in C#

我正在尝试将应用程序中的一些对象存储在缓存内存中,并在需要时重新使用它。

我创建了一个缓存助手 class,我将在其中执行所有相关功能,例如检查缓存和从缓存返回数据以及其他一些功能。

基本上我正在尝试缓存 WCF 服务返回的数据。

My consumer code for adding data to cache:
//input- is input parameters
var data= WCFService.GetDetails(input);
//var i = (RealTimeObject)details;    // Unboxing  
//Helper.AddToCache(cacheKeyName, i);
Helper.AddCache(cacheKeyName, data);

Helper.cs 添加缓存方法:

 public void AddCache(string key, object data)
  {
    if (cache == null) return;
    var absoluteExpiration = DateTime.Now.AddSeconds(300);
    cache.Add(key, data, null, absoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
  }

因此,当服务 returns 一些数据(那里有两个列表)时,它将被分配给数据变量并将其添加到缓存中,但在我们的业务逻辑中,我们正在制作一些项目数据为空,因此它也会影响缓存数据,因为我们使用引用存储它。 因此,任何人都知道我们如何克隆 wcf 返回的数据并将其存储在缓存中,或者任何以任何其他方式处理它的想法都将受到赞赏。如果我遗漏了什么,请告诉我,以便我提供更多详细信息。谢谢

已编辑:为什么正常拆箱并将其更改为值类型在这种情况下也不起作用?

正如 Stuartd 提到的,我已经通过转换为 Json 并作为普通对象返回来处理这个问题。

这是将数据添加到缓存的代码。

sereviceData = WCFService.GetDetails(Input);
if(sereviceData!=null)
{
  var dataToCache = JsonConvert.SerializeObject(sereviceData);
  Helper.Add(cacheName, dataToCache);
}

下面是用于从缓存中检索的代码示例,

if (Helper.CacheCheck(cacheName))
{
   var dataInCache= Helper.GetData(cacheName);
   var data = JsonConvert.DeserializeObject<RealTimeObject>(dataInCache.ToString());
   return data;
}