2011-08-29 5 views
5

sto lavorando con il cliente Enyim.Caching memcached per C# il server è http://memcached.org sull'ultima versione di Ubuntunon può memorizzare un oggetto complesso in memcached

MemcachedClient mc = new MemcachedClient(); 
XmlDocument xmlDocument = new XmlDocument(); 
mc.Store(StoreMode.Set, "foo", xmlDocument); 
object myXml= mc.Get("foo"); 

e myXML è nullo, perché c'è un modo per memorizzare il mio oggetto. Lo scopo: Sto cercando di sostituire HttpCache nel mio codice per Memcached ma con HttpCache posso aggiungere oggetti complessi alla cache.

Qui XmlDocument è un esempio, ma con una semplice classe non funziona troppo

+0

qual è la build di memcache che usi? Vi consiglio di usare [questo] (http://www.couchbase.com/products-and-services/memcached) su Windows. – Dasun

+0

Io lavoro con http://memcached.org su ubuntu e prima di cambiare tutto il mio server puoi confermarmi che con la tua soluzione sarò in grado di memorizzare un oggetto complesso? –

+0

'XmlDocument' non sembra essere binario' [Serializable] '. Utilizza la rappresentazione di stringa dell'XML, ad esempio 'xmlDocument.OuterXml'. –

risposta

9

Affinché classi da utilizzare con Memcached, devono sostenere serializzazione binario, questo consente agli oggetti di essere convertiti in un piatto rappresentazione dei byte di dati e quindi trasmessi al e dal server Memcached.

Nell'esempio si utilizza XmlDocument, che non è serializzabile in formato binario. È possibile aggirare il convertendolo da e per string che è binario serializzabile:

MemcachedClient mc = new MemcachedClient(); 
    XmlDocument xmlDocument = new XmlDocument(); 
    mc.Store(StoreMode.Set, "foo", xmlDocument.OuterXml); 
    string myXml = mc.Get("foo"); 
    XmlDocument xmlDocumentOut = new XmlDocument(); 
    xmlDocumentOut.LoadXml(myXml); 

Per le proprie classi personalizzate, è necessario aggiungere l'attributo [Serializable] e seguire le linee guida per la serializzazione binaria: SerializableAttribute Class.

+0

Non riesco ad aggiungere la stampa della memoria di XmlDocument? perché, l'idea è di evitare la serializzazione/deserializzazione che costano il tempo di processo –

+2

@Christophe Non è possibile evitare la serializzazione, poiché ciò è necessario affinché il proprio "oggetto" possa essere trasmesso al server Memcached. Il grafico dell'oggetto deve essere convertito in un flusso di dati orientato al byte piatto. Se hai bisogno di rendere questo processo più efficiente, proverò a usare protobuf.net, che è molto più efficiente della serializzazione binaria di .Net: maggiore e minore larghezza di banda.Hai ancora problemi con 'XmlDocument' dato che non è serializzabile in formato binario. Crea la tua classe e segui le linee guida di protobuf.net. –

+0

@Christophe Protobuf.net: http://code.google.com/p/protobuf-net/. –