Не удается сохранить сложный объект в memcached - PullRequest
5 голосов
/ 29 августа 2011

Я работаю с Enyim. При кэшировании клиента memcached для C # сервер http://memcached.org в последней версии ubuntu

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

и myXml имеет значение null, почему есть способ сохранить мой объект. Цель : Я пытаюсь заменить HttpCache в своем коде для Memcached, но с HttpCache я могу добавить сложный объект в кеш.

Здесь XmlDocument - пример, но с простым классом он тоже не работает

1 Ответ

9 голосов
/ 29 августа 2011

Для того чтобы классы могли использоваться с Memcached, им необходимо поддерживать двоичную сериализацию, это позволяет объектам преобразовываться в представление данных в виде плоских байтов, а затем передаваться на сервер Memcached и обратно.

В вашем примере вы используете XmlDocument, который не является двоичным сериализуемым. Вы можете обойти это, преобразовав его в string, который является двоичным сериализуемым:

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

Для собственных пользовательских классов необходимо добавить атрибут [Serializable] и следовать указаниям для двоичной сериализации: Класс SerializableAttribute .

...