如何压缩存储在会话/缓存中的对象?

时间:2008-10-23 22:12:09

标签: asp.net compression

Scott Hanselman最近发布了一个blog article,描述了如何压缩存储在会话/缓存中的字符串。这看起来很有希望,但我存储在会话/缓存中的大多数数据不是字符串而是自定义类。你会如何压缩这些?

我最初的想法是利用BinaryFormatter首先序列化对象(就像ASP.NET框架在将自定义类对象存储到会话/缓存中时一样),然后压缩生成的字节数组。但是,这会产生不利的副作用,即会话/缓存中检索到的数据将是只读的(因为解压缩和反序列化会创建一个新的内存中对象)。

换句话说,如果我的代码目前如下所示,是否有办法将其存储压缩到会话中?

MyClass foo = new MyClass();
Session["foo"] = foo;

MyClass retrievedFoo1 = (MyClass) Session["foo"];
retrievedFoo1.Property1 = "property 1";

// retrievedFoo2.Property1 should equal "property 1"!
MyClass retrievedFoo2 = (MyClass) Session["foo"];

3 个答案:

答案 0 :(得分:1)

首先,我将了解为什么需要压缩会话/缓存中的数据。压缩应该是最后的手段,更好的编程应该是第一个。

内存耗尽,如果是,哪些对象消耗最多?这应该指向代码改进的方向,以减少使用的内存量。

如果您的应用程序针对所需的对象进行了最佳优化,您可能需要查看内存不足的存储(如数据库或文件系统)来缓存较大的对象(这是序列化派上用场的地方)。 / p>

您还可以将InProc会话放在与Web服务器不同的服务器上,以提高可扩展性并在Web场上分发该站点。

答案 1 :(得分:0)

您可以使用XML Serializer将其转换为XML格式吗?

答案 2 :(得分:0)

据我了解,会话(重载)会话的性能下降是由于序列化/反序列化的开销,而不是存储大小。如果您正在考虑压缩以帮助解决性能问题,我认为您走的是错误的道路。 (De)压缩只会增加更多开销。

现在,如果您正在谈论缓存,那么事情会有所不同。但你特别提到会议......


我对您的问题感到困惑,刚刚阅读了您对Scott的文章的评论。看起来你并不真正理解你是通过在Session / Cache中添加一些内容来获得数据持久性,就像将它放入数据库或将其写入文件一样。压缩不会解决你所要求的问题。