2011-01-16 4 views
3

Ich erstelle einen Web-basierten IMAP-Client in Rails und möchte das IMAP-Objekt zwischen Anfragen zwischenspeichern. Ich plante, das Objekt zu serialisieren und es in Redis zu speichern (da es nur Strings zwischenspeichert), jedoch scheint keine der gängigen Serialisierungsmethoden zu funktionieren.Wie cache/serialisieren Sie ein Net :: IMAP-Objekt in Ruby/Rails?

Marshal und Active :: Cache :: Memorys beide geben dem folgenden Fehler

Marshal.dump(imap) 
TypeError: no marshal_dump is defined for class Mutex 

YAML Serialisierung funktioniert, aber Deserialisieren ausfällt.

s = YAML::dump(imap) # works, i.e. loads up a string with the imap data 
imap2 = YAML::load(s) 
TypeError: allocator undefined for Thread 

Gibt es einen anderen alternativen Caching-Mechanismus, der für beliebige Ruby-Objekten arbeitet, vor allem diejenigen, die Fäden intern verwenden könnten? Unterstützt ein alternativer Schlüssel/Wert-Speicher (ich habe Redis verwendet) ein solches Caching? Noch besser, gibt es überhaupt für Rails zu erinnern, bestimmte Objekte, anstatt mich deserialisieren sie?

PS> Ich benutze Ruby 1.9.2 mit Rails 3.0.3 auf einem Macbook, wenn das in irgendeiner Weise hilft.

Antwort

1

Serialisierung funktioniert nur für Datenobjekte (oder einen Teil der Daten eines Objekts). Netzwerkverbindungen können nicht serialisiert werden, da sie sehr spezifisch für einen Client, einen Server und eine Uhrzeit sind (in der Standardeinstellung läuft eine TCP-Verbindung nach 5 Minuten ab). Sie können eine globale IMAP-Verbindung verwenden, die Sie in Ihrer Anwendung speichern, aber möglicherweise stoßen Sie dort auf Probleme mit mehreren Benutzern. Der üblichste Weg besteht darin, einen Pool von Verbindungen zu haben, von denen Sie eine Verbindung ausleihen. Übrigens, treten beim Erstellen einer Verbindung jedes Mal Probleme auf? Ich würde die Verbindung nicht zwischenspeichern, sondern die Daten, die Sie über IMAP abgerufen haben und von dort aus arbeiten.

+0

Serialisierung der Daten ist, was ich gerade mache (zunächst versuchte ich, die Daten und die Verbindung zwischenzuspeichern). Was meinen Sie mit einer globalen IMAP-Verbindung? Wie machst du das? Variablen auf Klassenebene? –