【发布时间】: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