【问题标题】:How to do memory cache with Cloning of object in C#如何在 C# 中使用克隆对象进行内存缓存
【发布时间】:2019-06-26 17:39:46
【问题描述】:

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

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

基本上我是在尝试缓存 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 AddCache 方法:

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

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

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

【问题讨论】:

  • 一种选择是在缓存时将数据序列化为 Json,并在检索时反序列化。
  • @stuartd,你的意思是在缓存数据之前,在其他变量中序列化并通过从缓存中反序列化来检索它?
  • 你用的是什么缓存?
  • @stuartd 仅我使用的直接内存缓存。
  • WCF 不太可能返回值类型,因此此处不适用装箱和拆箱。

标签: c# wcf caching clone


【解决方案1】:

正如 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;
}

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2011-02-04
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多