Nesta aula, vamos aprender a armazenar objetos de classe: salvar e ler objetos.
Este código demonstra o armazenamento de tipos primitivos (int/bool) e objetos de classe personalizados com Memcached e aponta um erro muito comum:
Classes de entidade personalizadas precisam do atributo
[Serializable]. Sem ele, a serialização falha e a leitura retornanull.
Forma incorreta
static void Main(string[] args)
{
MemcachedClient mClient = new MemcachedClient();
// Salvar e ler tipos básicos (int, bool tem suporte nativo, sem atributo de serialização)
mClient.Store(StoreMode.Set, "clicks", 1);
var clicks = mClient.Get<int>("clicks");
mClient.Store(StoreMode.Set, "isOk", true);
var isOk = mClient.Get<bool>("isOk");
// Salvar objeto personalizado
var person = new Person { Id = 1, Name = "Jackson", AddTime = DateTime.Now };
mClient.Store(StoreMode.Set, "person", person);
var p = mClient.Get<Person>("person"); // Retorna null aqui
Console.Read();
}
// 【Erro】Falta [Serializable]
class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code language: JavaScript (javascript)
Comportamento observado
var p = mClient.Get<Person>("person"); retorna null.
Causa: O EnyimMemcached usa por padrão serialização binária do .NET. Classes sem o atributo [Serializable] não podem ser serializadas e não são desserializadas corretamente do cache.
Forma correta
Adicione o atributo de serialização na classe de entidade:
[Serializable] // Obrigatório
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code language: JavaScript (javascript)
Após adicioná‑lo, Get<Person>("person") retorna o objeto normalmente.
Observações adicionais
// Leitura genérica: Get<T> recomendado, conversão automática de tipo
var p = mClient.Get<Person>("person");
// Get não genérico: retorna object, é preciso fazer cast manual
var p2 = mClient.Get("person");Code language: JavaScript (javascript)
Get<T>(key): método genérico, use preferencialmente. Retorna o valor padrão do tipo em falhas (null para tipos de referência)Get(key): retorna o objeto bruto, você precisa converter manualmente
Exemplo completo
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); // Saída: Jackson
Console.Read();
}
}Code language: JavaScript (javascript)
Armazenamento de objetos