En esta lección aprenderemos a almacenar objetos de clase: guardar y leer objetos.
Este código muestra cómo Memcached almacena tipos primitivos (int/bool) y objetos de clase personalizados y señala un error muy habitual:
Las clases de entidad personalizadas deben llevar el atributo
[Serializable]. Si falta, la serialización falla y al leer el objeto se obtienenull.
Forma incorrecta
static void Main(string[] args)
{
MemcachedClient mClient = new MemcachedClient();
// Guardar y leer tipos básicos (int, bool soportados nativamente, sin atributo de serialización)
mClient.Store(StoreMode.Set, "clicks", 1);
var clicks = mClient.Get<int>("clicks");
mClient.Store(StoreMode.Set, "isOk", true);
var isOk = mClient.Get<bool>("isOk");
// Almacenar 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"); // Devuelve null aquí
Console.Read();
}
// 【Error】Falta [Serializable]
class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Lenguaje del código: JavaScript (javascript)
Comportamiento observado
var p = mClient.Get<Person>("person"); devuelve null.
Causa: EnyimMemcached usa por defecto la serialización binaria de .NET. Las clases sin el atributo [Serializable] no se pueden serializar y no se deserializan correctamente desde caché.
Forma correcta
Añade el atributo de serialización a la clase de entidad:
[Serializable] // Es obligatorio añadirlo
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Lenguaje del código: JavaScript (javascript)
Una vez añadido, Get<Person>("person") devuelve el objeto sin problemas.
Notas adicionales
// Lectura genérica: Get<T> recomendado, conversión automática de tipos
var p = mClient.Get<Person>("person");
// Get no genérico: devuelve object, requiere conversión manual
var p2 = mClient.Get("person");Lenguaje del código: JavaScript (javascript)
Get<T>(key): método genérico, usarlo preferentemente. Devuelve el valor por defecto del tipo si falla (null para tipos de referencia)Get(key): devuelve un objeto bruto, debes hacer el cast manualmente
Ejemplo 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); // Muestra Jackson
Console.Read();
}
}Lenguaje del código: JavaScript (javascript)
Almacenamiento de objetos