在C# ASP.Net中如何将对象数组保存到Session中?

6

我在C# ASP.Net程序中有一个对象数组,在postback期间填充,希望能在下一次postback期间恢复它们。为此,我将数组声明包含在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
}

该程序出现“对象引用未设置为对象的实例”错误。在调试时,Default 的所有其他成员变量在 saved_stuff 中都是可见的。


Iserializable不重要,因为您不会写入磁盘。您的数组真的很大吗,还是检索数据花了很长时间?也许服务器负载过重。看起来是一个非常奇怪的问题。 - MrFox
@MrFox,这些数组大约有十几个元素,我正在我的开发机器上工作,很抱歉它并没有超载。 - Brian Hooper
你用什么代码从会话中检索数组?你说它不起作用 - 但是它是什么? - Michael Paulukonis
啊,你从未直接存储或检索数组。这就是让我困惑的原因。看着上面的代码仍然让我感到困惑。 - Michael Paulukonis
3个回答

7

您需要将数组数据存储在其自己的会话对象中:

MyClass[] my_array = //Something

Session["ArrayData"] = my_array;

然后按以下方式检索它:
var arrayData = (MyClass[])Session["ArrayData"];

很好。很高兴能够帮助。 - Azhar Khorasany

3
根据MSDN,如果您将会话状态存储在内存中(默认情况下),则不需要进行序列化。
当您使用除InProc之外的其他会话状态模式时,会话变量类型必须是基元.NET类型或可序列化类型。这是因为会话变量值存储在外部数据存储器中。
我怀疑其他东西正在清除数组。请记住,
this.Session["This"] = this;

当使用内存中的会话状态时,不会创建页面对象的副本,因此您对页面对象("this")所做的任何更改也将被作用于“保存”的对象中。因此,如果您设置 this._saved_stuff = null,则保存对象的属性也将为null。
我不会尝试将页面存储在会话中,而应该挑选并选择要保存的值,并明确保存它们。
此外,如果您想要在下一个后续请求中恢复这些值,则可能需要选择ViewState。使用Session会存在某些风险,即会话在后续请求之间被销毁。这可能很少见,但是需要考虑到这一点。

谢谢你的提示。我会检查一下,但我怀疑我不是意外清除数组。这个问题影响了所有类的数组。原生类型、原生类型的数组、结构体和结构体的数组都按照我的预期返回,但所有类的数组都出现了这个问题。 - Brian Hooper

1
首先,您应该知道在Asp.net Web应用程序中有三种类型的会话状态: 1. 进程内 2. 状态服务器 3. 在数据库中
如果会话状态是进程内(默认情况下),您可以直接将对象保存到会话中;否则,您需要将对象标记为可序列化,以允许您将其保存到状态服务器或数据库中(在配置文件中设置)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接