我已经阅读了一些在服务器上存储视图状态的方法:
但它们有点复杂。我正在寻找一种无需序列化即可持久化对象的方法。我可以使用会话状态,但如果用户打开多个窗口,则可能会覆盖对象。
有一个简单的解决方案吗?
我正在寻找一种无需序列化即可持久化对象的方法。
小心点。这将对您站点的内存使用产生巨大影响,而内存使用通常是可扩展性的最大障碍。
在这种情况下,我会使用唯一键将对象存储在会话中,并将键绑定到页面。所有这些都可以抽象为页面类的属性。
public string PersistanceKey
{
get {
if(ViewState["PersistanceKey"] == null)
ViewState["PersistanceKey"] = "Object" + Guid.NewGuid().ToString();
return (string)ViewState["PersistanceKey"];
}
}
public PersistanceObject Persistance
{
get {
if(Session[this.PersistanceKey] == null)
Session[this.PersistanceKey] = new PersistanceObject();
return (PersistanceObject)Session[this.PersistanceKey];
}
不同的会话密钥将允许在每页的基础上使用不同的对象。或者,您可以考虑使用应用程序缓存(Cache 对象)来自动从内存中删除陈旧的条目,而不是使用 Session 对象,但这有其自身的警告。
应该注意的是,乔尔对他关于内存使用的回答的警告是完全准确的。对于低内存、高使用率或大持久性对象场景,这可能不是最佳主意。
为用户可能打开的每个窗口分配一个编号。将该数字附加到会话密钥。您还应该将数字存储在页面中的某处(查询字符串或隐藏输入),以便能够检索适当的会话变量。