本节课,我们学习如何存储一个类对象,完成对象的存储和读取
这段代码演示 Memcached 存储普通类型(int/bool)和自定义Class对象,同时点出一个极易踩坑的关键点:
自定义实体类必须标记
[Serializable]特性,否则序列化失败,读取对象返回null。
错误写法
static void Main(string[] args)
{
MemcachedClient mClient = new MemcachedClient();
// 基础类型存储读取(int、bool 原生支持,无需序列化标签)
mClient.Store(StoreMode.Set, "clicks", 1);
var clicks = mClient.Get<int>("clicks");
mClient.Store(StoreMode.Set, "isOk", true);
var isOk = mClient.Get<bool>("isOk");
// 自定义对象存储
var person = new Person { Id = 1, Name = "Jackson", AddTime = DateTime.Now };
mClient.Store(StoreMode.Set, "person", person);
var p = mClient.Get<Person>("person"); // 这里会得到 null
Console.Read();
}
// 【错误】缺少 [Serializable]
class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code language: JavaScript (javascript)
现象
var p = mClient.Get<Person>("person"); 获取结果为 null。
原因:EnyimMemcached 默认使用 .NET 二进制序列化保存对象,没有[Serializable]标记的类无法序列化,存入缓存后无法正常反序列化读取。
正确做法
给实体类增加序列化特性:
[Serializable] // 必须添加
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code language: JavaScript (javascript)
添加之后,Get<Person>("person") 就能正常拿到对象数据。
补充
// 泛型读取:Get<T> 推荐写法,自动类型转换
var p = mClient.Get<Person>("person");
// 非泛型Get:返回object,后续需要手动强制转换
var p2 = mClient.Get("person");Code language: JavaScript (javascript)
Get<T>(key):泛型方法,优先使用;读取失败返回对应类型默认值(引用类型返回null)Get(key):返回object原始对象,需要自行强转类型
完整例子
using Enyim.Caching;
using Enyim.Caching.Memcached;
using System;
[Serializable]
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}
class Program
{
static void Main(string[] args)
{
MemcachedClient mClient = new MemcachedClient();
mClient.Store(StoreMode.Set, "clicks", 1);
var clicks = mClient.Get<int>("clicks");
mClient.Store(StoreMode.Set, "isOk", true);
var isOk = mClient.Get<bool>("isOk");
var person = new Person { Id = 1, Name = "Jackson", AddTime = DateTime.Now };
mClient.Store(StoreMode.Set, "person", person);
var p = mClient.Get<Person>("person");
Console.WriteLine(p.Name); // 正常输出:Jackson
Console.Read();
}
}Code language: JavaScript (javascript)