2011-08-29 13 views
5

Estoy trabajando con el cliente Enyim.Caching memcached para C# es el servidor http://memcached.org en la última versión de Ubuntuno puede almacenar un objeto complejo en memcached

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

y myXML es nula, ¿por qué hay una manera para almacenar mi objeto El propósito: Estoy tratando de reemplazar HttpCache en mi código para Memcached pero con HttpCache puedo agregar un objeto complejo a la caché.

Aquí XmlDocument es un ejemplo, pero con una clase simple que no funciona demasiado

+0

¿Cuál es la compilación de Memcache que utiliza? Te recomiendo que uses [esto] (http://www.couchbase.com/products-and-services/memcached) en Windows. – Dasun

+0

Estoy trabajando con http://memcached.org en ubuntu y antes de cambiar todo mi servidor, ¿me pueden confirmar que con su solución podré almacenar objetos complejos? –

+0

'XmlDocument' no parece ser binario' [Serializable] '. Utilice la representación de cadena del XML en su lugar, es decir 'xmlDocument.OuterXml'. –

Respuesta

9

Para que las clases para ser utilizado con Memcached, que necesitan para apoyar la serialización binaria, esto permite que los objetos pueden convertir en un piso representación de datos de bytes y luego transmitidos hacia y desde el servidor Memcached.

En el ejemplo, usa XmlDocument, que no es binariamente serializable. Puede solucionar esto mediante su conversión hacia y desde el que string es binaria serializable:

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); 

Por sus propias clases personalizadas, es necesario añadir el atributo [Serializable] y seguir las directrices para la serialización binaria: SerializableAttribute Class.

+0

No puedo agregar la impresión de memoria de XmlDocument? porque, la idea es evitar la serialización/deserialización que cuesta tiempo de proceso –

+2

@Christophe No puede evitar la serialización, ya que esto es necesario para que su "objeto" pueda transmitirse al servidor de Memcached. El gráfico de objetos debe convertirse en una secuencia de datos orientada a bytes planos. Si necesita hacer que este proceso sea más eficiente, consideraría usar protobuf.net, que es mucho más eficiente que la serialización binaria de .Net, un ancho de banda más rápido y menor.Todavía tendrá problemas con 'XmlDocument' ya que no es binariamente serializable. Crea tu propia clase y sigue las pautas de protobuf.net. –

+0

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

Cuestiones relacionadas