如何在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),您可以将对象直接保存到会话中,或者您需要将对象标记为可序列化,这允许您将对象保存到状态服务器或数据库中(在配置文件)