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"];
答案 0 :(得分:1)
首先,我将了解为什么需要压缩会话/缓存中的数据。压缩应该是最后的手段,更好的编程应该是第一个。
内存耗尽,如果是,哪些对象消耗最多?这应该指向代码改进的方向,以减少使用的内存量。
如果您的应用程序针对所需的对象进行了最佳优化,您可能需要查看内存不足的存储(如数据库或文件系统)来缓存较大的对象(这是序列化派上用场的地方)。 / p>
您还可以将InProc会话放在与Web服务器不同的服务器上,以提高可扩展性并在Web场上分发该站点。
答案 1 :(得分:0)
您可以使用XML Serializer将其转换为XML格式吗?
答案 2 :(得分:0)
据我了解,会话(重载)会话的性能下降是由于序列化/反序列化的开销,而不是存储大小。如果您正在考虑压缩以帮助解决性能问题,我认为您走的是错误的道路。 (De)压缩只会增加更多开销。
现在,如果您正在谈论缓存,那么事情会有所不同。但你特别提到会议......
我对您的问题感到困惑,刚刚阅读了您对Scott的文章的评论。看起来你并不真正理解你是通过在Session / Cache中添加一些内容来获得数据持久性,就像将它放入数据库或将其写入文件一样。压缩不会解决你所要求的问题。