【问题标题】:Efficient and universal serializer for memcached .NET client用于 memcached .NET 客户端的高效通用序列化程序
【发布时间】:2013-07-22 14:17:20
【问题描述】:

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

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

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

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

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

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

是否有一个简单但可用于生产的 BinaryFormatter 替代品,它可以全局配置为仅序列化公共字段和道具并有效地存储它们(我猜是二进制)?一些“初始化并忘记”的东西,不需要任何属性或其他类型的模式定义,并且能够以与 BinaryFormatter 相同的方式处理可为空、可枚举、自定义类型、装箱对象的东西?

【问题讨论】:

  • LINQ 表达式有什么问题?
  • 我在许多文章中读到,使用不明确支持它们的序列化程序序列化 LINQ 表达式是一个坏主意。而且缓存 LINQ 查询的结果比缓存 LINQ 查询本身要合理得多。这就是为什么我们的开发人员甚至不尝试序列化/缓存 LINQ 查询。

标签: .net serialization memcached


【解决方案1】:

看看Sharpserializer。它看起来不错,但有些问题。

【讨论】:

  • 谢谢。在阅读有关sharpserializer 的信息时,我还发现了SilverlightSerializer,它需要一些用户提供的修复,但最终结果证明它比sharpserializer 好一点。但它们都比 BinaryFormatter 好得多,并且可以很好地处理我扔给它们的所有东西 - 枚举、列表、字典、递归引用等。
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2012-08-15
  • 2016-10-13
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多