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 renvoienull.
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