对象存储

本节课,我们学习如何存储一个类对象,完成对象的存储和读取

这段代码演示 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:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注