物件儲存

本課我們將學習如何儲存類別物件,完成物件的儲存與讀取作業

這段程式碼示範 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)

物件儲存

Previous:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *