Objektspeicherung

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 wird null zurü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 rohes object zurü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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert