2010-01-23 23 views
5

我只是開始切換到memcached,目前正在使用memcached進行測試。無論如何要爲Memcached系統化linq對象嗎?

我有2對象,我創建一個對象,並把[序列化]在它(例如,讓調用這個Object1),則使用LINQ DBML(Object2)創建的其他對象..

我試圖memcached List<Object1>,它工作得很好,像魅力,這裏的一切緩存和正確加載。

但是,接着我轉到Linq對象,現在我嘗試添加到memcached List<Object2>這不起作用,它根本沒有添加到memcached中。沒有添加任何密鑰

我繼續並將序列化模式更改爲單向,再次添加,仍然沒有希望。

有沒有辦法讓這項工作?

下面是簡單的測試,我只是寫,使用MemcachedProvider從CodePlex上證明:

public ActionResult Test() 
{ 
    var returnObj = DistCache.Get<List<Post>>("testKey"); 
    if (returnObj == null) 
    { 
     DataContext _db = new DataContext(); 
     returnObj = _db.Posts.ToList(); 
     DistCache.Add("testKey", returnObj, new TimeSpan(29, 0, 0, 0)); 
     _db.Dispose(); 
    } 

    return Content(returnObj.First().TITLE); 
} 

這是Memcached的,沒有店面被稱爲:

> NOT FOUND _x_testKey 
>532 END 
<528 get _x_testKey 
> NOT FOUND _x_testKey 
>528 END 
<516 get _x_testKey 
> NOT FOUND _x_testKey 
>516 END 

而在我的SQL事件探查器,它爲3個測試時間調用3個查詢=>證明從Memcached回調的對象爲null,然後查詢。

+0

這個問題可以從(1)一些代碼樣本(2)什麼錯誤的更清楚的解釋中受益(3)你是如何使用.NET中的memcached的。有多個.NET包裝器,它們在這方面可能並不一樣。 – 2010-01-23 04:15:35

+0

我添加了所有你需要的。 im使用的包裝是來自codeplex的MemcachedProvider。 object1已成功添加,但不知何故linq對象沒有。 – DucDigital 2010-01-23 04:26:36

+0

額外信息有幫助,但我沒有看到問題。你調試了Add()調用嗎?如何使用TCP代理或Wireshark來查看MemcachedProvider是否甚至向此memcached發送任何請求? – 2010-01-23 05:07:28

回答

2

它看起來像默認實現(DefaultTranscoder)是使用BinaryFormatter; 「單向」東西是對不同串行器(DataContractSerializer)的指令,並且不是添加[Serializable]

(注:我添加了一個memo to myself來嘗試寫入memcached的一個protobuf網轉碼器,這將是和會解決這個最自由)

我沒有測試過,但有幾個選項出現了:

  1. 寫檢測[DataContract],並使用DataContractSerializer不同的轉碼器的實現,並且這種鉤碼器
  2. 通過局部類添加[Serializable]到您的類型(我不相信這會由於LINQ字段類型不是可序列化工作)
  3. 在使用DataContractSerializer
  4. 像3部分類添加ISerializable實現,但使用protobuf網,其中:可與「單向」,和b:速度更快,小於DataContractSerializer
  5. 寫一個序列化的DTO和您的類型映射到

最後是簡單的,但可能會增加更多的工作。

我很想先看看第三個選項,因爲第一個涉及重建供應商;第四個選項也將絕對是在我要測試的事情列表上。


我用3掙扎,由於DCS反序列化過程返回不同對象;我轉而使用protobuf-net,因此下面的版本顯示在您現有的[DataContract]類型中添加partial class,使其與BinaryFormatter一起使用。其實,我懷疑(有證據),這也將使它更有效的(比原[Serializable]),太:

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
using ProtoBuf; 

/* DBML generated */ 
namespace My.Object.Model 
{ 
    [DataContract] 
    public partial class MyType 
    { 
     [DataMember(Order = 1)] 
     public int Id { get; set; } 

     [DataMember(Order = 2)] 
     public string Name { get; set; } 
    } 
} 
/* Your extra class file */ 
namespace My.Object.Model 
{ 
    // this adds **extra** code into the existing MyType 
    [Serializable] 
    public partial class MyType : ISerializable { 
     public MyType() {} 
     void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { 
      Serializer.Serialize(info, this); 
     } 
     protected MyType(SerializationInfo info, StreamingContext context) { 
      Serializer.Merge(info, this); 
     } 
    } 
} 
/* quick test via BinaryFormatter */ 
namespace My.App 
{ 
    using My.Object.Model; 
    static class Program 
    { 
     static void Main() 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      MyType obj = new MyType { Id = 123, Name = "abc" }, clone; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       bf.Serialize(ms, obj); 
       ms.Position = 0; 
       clone = (MyType)bf.Deserialize(ms); 
      } 
      Console.WriteLine(clone.Id); 
      Console.WriteLine(clone.Name); 
     } 
    } 
} 
+0

我對你的問題增加了一些評論,你可以退房嗎? – DucDigital 2010-01-29 13:58:52