如何在C#ASP.Net Sesssion中保存对象数组?
我在C#ASP.Net程序中有一个在回发期间填充的对象数组,我希望在下一个回发期间恢复它们。 为此,我在Default类定义中包含了数组声明,因此保存了: –
this.Session["This"] = this;
并恢复: –
Default saved_stuff = (Default) this.Session["This"];
这适用于除以下之外的所有内容: –
MyClass [] my_array;
恢复后, saved_stuff.my_array
始终为null
。
MyClass定义如下: –
public MyClass : ISerializable { private string some_string; private double some_double; // some more simple members // Some getters and setters // ISerializable Implementation }
我试过让MyClass
实现ISerializable
但这没有任何区别。 有谁知道我应该做什么?
编辑回答@Michael的问题,我当时做的事……
for (int i = 0; i <= saved_stuff.my_array.GetUpperBound(0); i++) { // blah blah }
失败的“对象引用未设置为对象的实例”。 在调试时, saved_stuff
所有其他成员变量都可见。
您必须将数组数据存储在自己的会话对象中:
MyClass[] my_array = //Something Session["ArrayData"] = my_array;
然后将其检索为:
var arrayData = (MyClass[])Session["ArrayData"];
根据MSDN ,如果您将会话状态存储在内存中(默认值),则它不需要可序列化
当您使用InProc以外的会话状态模式时,会话变量类型必须是原始.NET类型或可序列化。 这是因为会话变量值存储在外部数据存储中。
我怀疑其他东西正在清理arrays。 记住这一点
this.Session["This"] = this;
当使用内存中会话状态时,不会创建页面对象的副本 ,因此您对页面对象(“ this
”)所做的任何更改也将对“已保存”对象进行。 因此,如果设置this._saved_stuff = null
则保存对象的属性也将为null。
我不会尝试将页面存储在会话中,而是选择要保存的值并明确保存它们。
此外,如果您希望在下一个回发中可以恢复这些值,则可能需要选择ViewState
。 使用Session
确实会产生一些风险,即会话将在回发之间销毁。 这可能很少见,但这是一种考虑因素。
首先,您应该知道在Asp.net Web应用程序中有三种类型的会话状态1.正在进行中2.状态服务器3.在数据库中
如果会话状态正在进行(这是defalut),您可以将对象直接保存到会话中,或者您需要将对象标记为可序列化,这允许您将对象保存到状态服务器或数据库中(在配置文件)