本課我們將學習如何儲存類別物件,完成物件的儲存與讀取作業
這段程式碼示範 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)
物件儲存