2010-01-23 19 views
5

Sadece memcached'e geçmeye ve şu anda memcached ile test etmeye başladım. Ben 2 nesneyi yaşıyorumMemcached için linq nesnesini serilize etmek için zaten var mı?

, ben bir nesne oluşturulur ve diğer nesne Linq DBML (Object2) kullanılarak oluşturulur .. (bu Object1 diyelim, örneğin) üzerinde

I [Serializable] koymak List<Object1> memcached çalıştı, bu sadece güzel, çekicilik gibi çalışır, burada her şey önbellek ve düzgün yüklenir.

Ama sonra Linq nesnesine geçiyorum, şimdi List<Object2> numaralı memcached'ı eklemeye çalışıyorum, bu işe yaramaz, hiç memcached eklemedi. anahtar eklenmedi

Serileştirme Modunu Tek Yönlülük olarak değiştirip değiştirin, tekrar ekleme yapın, hala bir ümit yok.

Bu işi yapmak için zaten var mı?

İşte göstermek için CodePlex MemcachedProvider kullanılarak, sadece yazdım basit bir testtir: Bu Memcached dan

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

, hiçbir MAĞAZA denirdi:

> 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 

Ve SQL profilcisine içinde

, 3 test süresi için 3 sorgu çağırdı => Memcached'den geri çağrılan nesnenin boş olduğunu kanıtladı, sonra sorguladı.

+0

Bu soru ne yanlış gidiyor (1) Bazı kod örnekleri (2) Daha net bir açıklama yararlanabilecek tam olarak ve (3) NET'ten memcached'i tam olarak nasıl kullanıyorsunuz. Çok sayıda .NET sarmalayıcısı var ve bunların hepsi bu açıdan aynı davranmayabilir. –

+0

İhtiyacınız olan her şeyi ekledim. Imgecinin imi, codeplex'ten MemcachedProvider'dir. Object1 başarıyla eklendi ancak bir şekilde linq nesnesi yoktu. – DucDigital

+0

Ek bilgi yardımcı olur, ancak bir sorun görmüyorum. Add() çağrısında hata ayıklamadınız mı? MemcachedProvider'ın bu istek için memcached'e bir şey yollayıp göndermediğini görmek için bir TCP proxy veya Wireshark kullanmaya ne dersiniz? –

cevap

2

Varsayılan uygulama (DefaultTranscoder) BinaryFormatter; "tek yönlü" şeyler, farklı bir serileştiriciye (DataContractSerializer) bir talimattır ve ,, [Serializable]'u eklemez.

(Not: Ben memcached için protobuf-net transcoder'ı yazmaya denemek için bir memo to myself ekledik, yani serin olacak ve ücretsiz olarak bunun en şike yapacak) Ben test etmedim

,

  1. [DataContract] algılar ve DataContractSerializer kullanan farklı Transkodlayıcı uygulanmasını yazmak ve
  2. kısmi sınıfının aracılığıyla türlerine [Serializable] eklemek Bu transkoder kanca: ancak birkaç seçenekleri kendilerini
  3. 3 gibi DataContractSerializer
  4. kullanan bir kısmi sınıfta bir ISerializable uygulamasını ekleyin (bu varlık seri hale getirilebilir değil LINQ alan türlerinden dolayı çalışacak ikna olmadım), ancak protobuf-net bir kullanma: ile çalışır "tek yönlü" ve b: daha hızlı ve
  5. daha küçük DataContractSerializer bir seri hale getirilebilir DTO yazmak ve son basittir ama daha fazla iş ekleyebilir

olduğu için türleri haritası olduğunu.

İlk olarak 3. seçeneği incelemek isterim; çünkü 1. sağlayıcı yeniden oluşturmayı gerektirir; 4. seçenek de test edilecek şeyler listemde kesinlikle olacaktır.


I seri kaldırma sırasında bir farklı nesnesi geri nedeniyle DCS için, 3 ile mücadele; Bunun yerine protobuf-net'e geçiş yaptım, işte partial class'u'a ekleyerek mevcut [DataContract] türüne eklendiğini gösteren bir sürüm. Aslında ben de, bu da çok etkili (ham [Serializable] yerine) yapacak (kanıtlarla) şüpheli:

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

Sorununuza biraz yorum ekledim, kontrol edebilir misiniz? – DucDigital

İlgili konular