In dieser Lektion lernen wir, wie man Klassenobjekte speichert und wieder ausliest.
Dieser Code demonstriert die Speicherung von primitiven Typen (int/bool) und benutzerdefinierten Klassenobjekten mit Memcached und weist auf eine häufige Fehlerquelle hin:
Benutzerdefinierte Entitätsklassen müssen mit dem Attribut
[Serializable]markiert werden. Andernfalls schlägt die Serialisierung fehl und beim Lesen wirdnullzurückgegeben.
Falsche Schreibweise
static void Main(string[] args)
{
MemcachedClient mClient = new MemcachedClient();
// Speichern und Lesen von Grundtypen (int, bool werden nativ unterstützt, kein Serialisierungsattribut nötig)
mClient.Store(StoreMode.Set, "clicks", 1);
var clicks = mClient.Get<int>("clicks");
mClient.Store(StoreMode.Set, "isOk", true);
var isOk = mClient.Get<bool>("isOk");
// Speichern eines benutzerdefinierten Objekts
var person = new Person { Id = 1, Name = "Jackson", AddTime = DateTime.Now };
mClient.Store(StoreMode.Set, "person", person);
var p = mClient.Get<Person>("person"); // Gibt hier null zurück
Console.Read();
}
// 【Fehler】[Serializable] fehlt
class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code-Sprache: JavaScript (javascript)
Beobachtetes Verhalten
var p = mClient.Get<Person>("person"); liefert null als Ergebnis.
Grund: EnyimMemcached nutzt standardmäßig die binäre .NET‑Serialisierung. Klassen ohne [Serializable]‑Attribut lassen sich nicht serialisieren und können aus dem Cache nicht deserialisiert werden.
Korrekte Vorgehensweise
Fügen Sie das Serialisierungsattribut zur Entitätsklasse hinzu:
[Serializable] // Muss zwingend vorhanden sein
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code-Sprache: JavaScript (javascript)
Nach dem Hinzufügen gibt Get<Person>("person") das Objekt korrekt zurück.
Zusätzliche Hinweise
// Generisches Lesen: Get<T> empfohlen, automatische Typumwandlung
var p = mClient.Get<Person>("person");
// Nicht‑generisches Get: Gibt object zurück, manuelle Typumwandlung erforderlich
var p2 = mClient.Get("person");Code-Sprache: JavaScript (javascript)
Get<T>(key): Generische Methode, bevorzugt verwenden. Gibt den Standardwert des Typs bei Fehler zurück (null für Referenztypen)Get(key): Gibt rohesobjectzurück, muss manuell umgewandelt werden
Vollständiges Beispiel
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); // Gibt Jackson aus
Console.Read();
}
}Code-Sprache: JavaScript (javascript)
Objektspeicherung