【问题标题】:Cannot store a complex object in memcached无法在 memcached 中存储复杂对象
【发布时间】:2011-11-05 21:34:05
【问题描述】:

我正在使用 Enyim。为 C# 缓存 memcached 客户端,服务器在 ubuntu 的最新版本上是 http://memcached.org

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

而 myXml 为空,为什么有办法存储我的对象。 目的 : 我正在尝试在 Memcached 的代码中替换 HttpCache,但使用 HttpCache 我可以将复杂对象添加到缓存中。

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

【问题讨论】:

  • 您使用的内存缓存版本是什么?我建议你在 Windows 上使用this
  • 我在 ubuntu 上与 memcached.org 合作,在我更改所有服务器之前,您能否确认我使用您的解决方案可以存储复杂对象?
  • XmlDocument 似乎不是二进制的[Serializable]。改用 XML 的字符串表示,即xmlDocument.OuterXml
  • @chibacity 但是 XmlDocument 不是二进制可序列化的
  • @Christophe 我知道XmlDocument 不是二进制可序列化的,因此我的评论。我建议string 因为它是二进制可序列化的。您的课程必须支持[Serializable] 才能工作。我建议使用字符串,因为您可以转换回XmlDocument。要序列化您的自定义类,请参阅:msdn.microsoft.com/en-us/library/…

标签: c# memcached enyim


【解决方案1】:

为了让类与 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 Class

【讨论】:

  • 无法添加XmlDocument的内存打印?因为,我们的想法是避免花费过程时间的序列化/反序列化
  • @Christophe 您无法避免序列化,因为这是必需的,以便您的“对象”可以传输到 Memcached 服务器。对象图需要转换为面向平面字节的数据流。如果您需要使这个过程更高效,我会考虑使用 protobuf.net,它比 .Net 的二进制序列化效率更高 - 更快且带宽更少。 XmlDocument 仍然存在问题,因为它不是二进制可序列化的。创建您自己的课程并遵循 protobuf.net 的指南。
  • @Christophe Protobuf.net 是一个非常高效的 binary 序列化器,json 是 text。 Json 仍然不如 xml 冗长,但 Protobuf 非常快并且产生的有效负载要小得多。
  • 看起来 memcached 需要 Serializable 才能将自定义类保存到缓存中,谢谢!
猜你喜欢
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多