用于memcached .NET客户端的高效通用序列化程序

时间:2013-07-23 13:21:06

标签: .net serialization memcached

我们有一个ASP.NET MVC应用程序,目前正在使用.NET MemoryCache。 MemoryCache快速而高效,主要是因为它不会克隆或序列化数据,但实质上是存储对象的引用。

最近我们的客户决定我们需要扩展。为了测试我们的应用程序在多个进程中运行时的行为,我们的Web管理员将应用程序池配置为使用多个工作进程(所谓的“Web园”模式)。我们的缓存开始返回不同的结果,具体取决于哪个工作进程为当前请求提供服

我们想不出任何简单的方法来同步清理所有工作进程的MemoryCache实例的缓存条目(似乎没有IIS API可以让我们枚举我们应用程序的所有工作进程并调用一些“CleanUp”每个应用实例的方法)。所以我们决定采用更严肃的方式 - memcached,稍后我们也可以在专用的Linux服务器上设置缓存。

很容易安装memcached并开始使用Enyim .NET客户端。但后来我们因为我们无法像MemoryCache那样立即缓存所有内容而停止了这一事实。现在我们需要序列化所有内容。起初我们尝试了.NET BinaryFormatter(默认情况下由Enyim使用),但它需要在每个对象上使用[Serializable]属性,我们不能花费太多时间来抓取所有代码库并使用[Serializable]标记每个对象。另一个问题 - 我们不想像BinaryFormatter那样序列化所有私有字段和道具。在其他方面,BinaryFormatter是我们能得到的最好的 - 它能够处理我们抛出的所有东西。

然后我们尝试了着名的protobuf-net。抱歉,Marc,但它对我们不起作用,它需要太多的元数据配置。

我们不需要具有版本控制或反向兼容性的序列化程序,因为我们可以在部署新版本时清理缓存。我们有很多种可缓存的对象,但没有太多花哨,没有LINQ表达式,没有可观察的集合,也没有其他类型的对象,这些对象通常对大多数序列化器来说都有问题。

是否有一个简单但生产就绪的BinaryFormatter替代品,它可以全局配置为仅序列化公共字段和道具并有效地存储它们(我猜 - 二进制)?什么“初始化和忘记”,不需要任何属性或其他类型的模式定义,并且能够以与BinaryFormatter相同的方式处理nullables,enumerables,自定义类型,盒装对象? < / p>

1 个答案:

答案 0 :(得分:2)

看一下sharpserializer。它看起来很不错,但有一些问题。