Duc*_*tal 5 memcached linq-to-sql
我刚刚开始切换到memcached,目前正在使用memcached进行测试.
我有2个对象,我创建了一个对象并在其上放置了[Serializable](例如,让我们调用它Object1),另一个对象是使用Linq DBML(Object2)创建的.
我试着memcached List<Object1>,它工作得很好,就像魅力一样,这里的一切都是缓存和正确加载.
但接着,我转到Linq对象,现在我尝试添加到memcached List<Object2>这不起作用,它根本没有添加到memcached.没有添加密钥
我继续前进并将序列化模式更改为单向,再次添加,仍然没有希望.
反正有没有让这项工作?
这是我刚刚编写的简单测试,使用codeplex中的MemcachedProvider来演示:
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);
}
Run Code Online (Sandbox Code Playgroud)
这是来自Memcached,没有调用STORE:
> 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
Run Code Online (Sandbox Code Playgroud)
在我的SQL分析器中,它调用3个查询3个测试时间=>证明从Memcached返回的对象为null,然后查询.
看起来默认实现 ( DefaultTranscoder) 是使用BinaryFormatter; “单向”内容是针对不同序列化器 ( ) 的指令DataContractSerializer,并且不添加[Serializable].
(注:我给自己添加了一份备忘录,尝试为 memcached 编写一个 protobuf-net 转码器;这会很酷,并且可以免费修复大部分问题)
我还没有测试过,但有一些选择:
[DataContract]和使用DataContractSerializer,并挂钩此转码器[Serializable]到您的类型(由于 LINQ 字段类型不可序列化,我不相信这会起作用)ISerializable在使用的分部类中添加一个实现DataContractSerializerDataContractSerializer最后一个很简单,但可能会增加更多工作。
我很想首先考虑第三个选项,因为第一个选项涉及重建提供者;第四个选项也肯定会出现在我要测试的列表中。
我在 3 上遇到了困难,因为 DCS 在反序列化期间返回了不同的对象;我改用了 protobuf-net,所以这里的版本显示了将 a 添加partial class到现有[DataContract]类型,使其可以与BinaryFormatter. 实际上,我怀疑(有证据)这也将使其更加高效(比 raw [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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1398 次 |
| 最近记录: |