2

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

我最初的想法是先利用 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"];
4

3 回答 3

1

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

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

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

您还可以将 InProc 会话放置在与 Web 服务器不同的服务器上,以提高可伸缩性并将站点分布在 Web 场上。

于 2008-10-25T07:06:38.243 回答
0

您可以使用 XML 序列化器将其转换为 XML 格式吗?

于 2008-10-24T14:16:31.043 回答
0

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

现在,如果您谈论的是缓存,那么情况就有些不同了。但是您特别提到了会话...


刚刚阅读了您对斯科特文章的评论,我对您的问题感到困惑。似乎您并不真正了解通过将某些内容放入 Session/Cache 中来获得数据持久性,就像您将其放入数据库或将其写入文件一样。压缩不会解决你所问的问题。

于 2008-10-25T06:37:39.190 回答