Armazenamento de objetos

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

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

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *