Almacenamiento de objetos

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 obtiene null.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *