我目前能够将我创建的对象存储到HttpContext.Current.Session
中,并且我遇到了protobuf-net。有没有办法通过protobuf序列化来存储我的对象?protobuf-net:如何在用户会话中存储
看起来protobuf想要将信息存储到Stream
,所以我(我可以吗?)将Stream
对象存储到用户会话中吗?或者我应该先将它从Stream
转换为另一种对象类型?如果是这样,转换序列化的对象会绕过使用protobuf的原始目的(cpu使用情况,内存使用情况)吗?有没有人做过这个?
我的目标是使用protobuf作为压缩层将信息存储到用户会话中。是否有更好的方式(更小的尺寸,更快的压缩率,更容易维护,更小的实现开销),还是最适合这项任务的工具?
更新
我使用这个类对象
[Serializable]
public class DynamicMenuCache
{
public System.DateTime lastUpdated { get; set; }
public MenuList menu { get; set; }
}
这个类是我的菜单列表类的包装,这是(基本上)包含内置列表的列表类型(字符串,整数)。我创建了包装器来将时间戳与我的对象相关联。
如果我有一个会话缓存未命中(会话密钥为空或session.lastUpdated大于全局存储时间),我做我的正常数据库查找(MSSQL),创建MenuList
对象,并将其存储到会话中,像这样
HttpContext.Current.Session.Add("DynamicMenu" + MenuType, new DynamicMenuCache()
{
lastUpdated = System.DateTime.Now,
menu = Menu
});
当前我们的会话存储在内存中,但我们可能会在未来移动到数据库会话存储。
我们的会话使用非常繁重,因为我们存储了大量的大对象(尽管我希望在将来的某个时刻清理会话中存储的内容)。
例如,我们将每个用户的权限集存储到其会话存储中以避免数据库命中。当前有许多存储结构的权限和权限存储在会话中。
在这一点上,我只是查看可用的选项,因为我希望在将来更智能和严格地使用会话缓存。
请让我知道,如果有什么你需要的。
我想这取决于状态对象的复杂性/大小,对象越大,受益于protobuf。对于简单的对象,它可能是一个有双重序列化的笔触。编辑:你可以基准memcached + protobuff实现与经典的asp.net会话状态服务器为不同的会话对象,它将interresting :) – Guillaume86 2011-12-13 17:25:06
嗨JesseB - 你目前的设置是什么?您目前使用哪种会话提供程序?在记忆中? SQL?要么...?另外:你的会话使用有多广泛?另外,你在会话中存储什么类型的东西? (所以我可以给出最合适的指导) – 2011-12-13 18:01:48