Stockage d’objet

Dans cette leçon, nous apprenons à stocker des objets de classe : sauvegarde et lecture des objets.

Ce code illustre le stockage par Memcached des types primitifs (int/bool) et des objets de classe personnalisés, et souligne une erreur très fréquente :

La classe d’entité personnalisée doit être décorée avec l’attribut [Serializable]. Sans lui, la sérialisation échoue et la lecture renvoie null.

Mauvaise implémentation

static void Main(string[] args)
{
    MemcachedClient mClient = new MemcachedClient();

    // Stockage‑lecture types primitifs (int, bool gérés nativement, pas d’attribut requis)
    mClient.Store(StoreMode.Set, "clicks", 1);
    var clicks = mClient.Get<int>("clicks");

    mClient.Store(StoreMode.Set, "isOk", true);
    var isOk = mClient.Get<bool>("isOk");

    // Stockage objet personnalisé
    var person = new Person { Id = 1, Name = "Jackson", AddTime = DateTime.Now };
    mClient.Store(StoreMode.Set, "person", person);
    var p = mClient.Get<Person>("person"); // Retourne null ici
    Console.Read();
}

// 【Erreur】Manque [Serializable]
class Person
{
    public int Id { set; get; }
    public string Name { set; get; }
    public DateTime AddTime { set; get; }
}Langage du code : JavaScript (javascript)
Comportement observé

var p = mClient.Get<Person>("person"); renvoie null.
Cause : EnyimMemcached utilise par défaut la sérialisation binaire .NET. Les classes sans attribut [Serializable] ne peuvent pas être sérialisées et ne se désérialisent pas depuis le cache.

Bonne implémentation

Ajoutez l’attribut de sérialisation sur la classe d’entité :

[Serializable] // Obligatoire
public class Person
{
    public int Id { set; get; }
    public string Name { set; get; }
    public DateTime AddTime { set; get; }
}Langage du code : JavaScript (javascript)

Une fois ajouté, Get<Person>("person") récupère correctement l’objet.

Compléments

// Lecture générique : Get<T> à préférer, conversion automatique
var p = mClient.Get<Person>("person"); 

// Get non générique : retourne object, conversion manuelle obligatoire
var p2 = mClient.Get("person");Langage du code : JavaScript (javascript)
  • Get<T>(key) : méthode générique à privilégier. Retourne la valeur par défaut du type en cas d’échec (null pour les types référence)
  • Get(key) : retourne un objet brut, vous devez le caster vous‑même

Exemple complet

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); // Affiche Jackson

        Console.Read();
    }
}Langage du code : JavaScript (javascript)

Stockage d’objet

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *