Search code examples
c#memcachedenyim

Cannot store a complex object in memcached


I'm working with Enyim.Caching the memcached client for C# the server is http://memcached.org on the last version of ubuntu

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

and myXml is null, why is there a way to Store my object. The purpose : I'm trying to replace HttpCache in my code for Memcached but with HttpCache I can add complex object to the cache.

Here XmlDocument is an example but with a simple class it doesn't work too


Solution

  • In order for classes to be used with Memcached, they need to support binary serialization, this allows objects to be converted to a flat byte data-representation and then transmitted to and from the Memcached server.

    In your example you use XmlDocument, which is not binary serializable. You can work around this by converting it to and from string which is binary 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);
    

    For your own custom classes, you need to add the [Serializable] attribute and follow guidelines for binary serialization: SerializableAttribute Class.