无法在memcached中存储复杂对象

Chr*_*ove 5 c# memcached enyim

我正在使用Enyim.Caching 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");
Run Code Online (Sandbox Code Playgroud)

并且myXml为null,为什么有一种存储我的对象的方法.目的:我正在尝试在我的代码中替换HttpCache用于Memcached但是使用HttpCache我可以将复杂对象添加到缓存中.

这里XmlDocument是一个例子,但是使用简单的类它也不起作用

Tim*_*oyd 9

为了使类与Memcached一起使用,它们需要支持二进制序列化,这允许将对象转换为扁平字节数据表示,然后传输到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);
Run Code Online (Sandbox Code Playgroud)

对于您自己的自定义类,您需要添加[Serializable]属性并遵循二进制序列化的准则:SerializableAttribute类.

  • @Christophe您无法避免序列化,因为这是必需的,以便您的"对象"可以传输到Memcached服务器.需要将对象图转换为面向字节的扁平数据流.如果你需要提高这个过程的效率,我会考虑使用protobuf.net,它比.Net的二进制序列化更有效 - 更快,带宽更少.你仍然会遇到`XmlDocument`的问题,因为它不是二进制序列化的.创建自己的类并遵循protobuf.net的指导原则. (2认同)