我在我的应用程序中创建了一个使用AOP进行缓存的新功能。
当使用RedisCacheableResultAttribute
调用我的方法时,我将缓存/检索数据。
我已经成功存储,不知道它是否正确地序列化并存储为字符串,但是当我从Redis返回对象时,我需要转换为第一次存储的类型。
我想我可以用反射来做,但没有成功,我对反射不是很有经验。
public sealed override void OnInvoke(MethodInterceptionArgs args)
{
var cache = RedisConnectorHelper.Connection.GetDatabase();
var result = cache.StringGet(args.Method.Name); // retrieving from Redis
if (result.HasValue)
{
args.ReturnValue = result; // here I need to convert back to the type I received when I stored.
return;
}
base.OnInvoke(args);
cache.StringSet(args.Method.Name, Serialize(args.ReturnValue)); //storing the data OK.
}
private string Serialize(object obj)
{
return JsonConvert.SerializeObject(obj);
}
答案 0 :(得分:2)
此处无需反思,只需使用 JsonSerializerSettings 将您的类型保存在数据blob中:
private static readonly JsonSerializerSettings _settings = new JsonSerializerSettings { TypeHandling = TypeHandling.Object };
然后将其用于序列化和反序列化方法:
private static string Serialize(object obj)
{
return JsonConvert.SerializeObject(obj, _settings);
}
private static object Deserialize(string data)
{
return JsonConvert.DeserializeObject(data, _settings);
}
然后在代码中:
public sealed override void OnInvoke(MethodInterceptionArgs args)
{
var cache = RedisConnectorHelper.Connection.GetDatabase();
var result = cache.StringGet(args.Method.Name); // retrieving from Redis
if (result.HasValue)
{
args.ReturnValue = Deserialize(result);
return;
}
base.OnInvoke(args);
cache.StringSet(args.Method.Name, Serialize(args.ReturnValue));
}
为了更快的解决方案,我建议你使用另一种称为BSON(二进制json)的Newtonsoft格式,它会将你的对象转换为字节数组,比字符串快得多。因此,只要您不关心可读性,使用它将是明智之举。
我没有测试它,因此可能是编译错误,但是Newtonsoft有他们保存类型的方法,所以你不应该为此烦恼。
答案 1 :(得分:0)
修复了以下解决方案的问题:
在我使用Apsect的输入法中,我将类型更改为动态。使用对象也可以。
[RedisCacheableResult]
public List<dynamic> ReturnCustomer()
{
var lstCustomer = new List<dynamic>();
var customer = new Customer
{
Id = 1,
Name = "Acme Inc",
Email = "acme@email.com"
};
var customer1 = new Customer
{
Id = 2,
Name = "Marvel Inc",
Email = "Marvel@email.com"
};
lstCustomer.Add(customer);
lstCustomer.Add(customer1);
return lstCustomer;
}
反序列化:
private static dynamic Deserialize(string data)
{
return JsonConvert.DeserializeObject<List<dynamic>>(data, Settings);
}
segueasoluçãopublicadano GitHub :https://github.com/thiagoloureiro/TestaCache
欢迎提出问题,请求,明星和叉子。)