如何在C#ASP.Net Sesssion中保存一组对象?

时间:2012-12-14 15:30:37

标签: c# asp.net session

我在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
}

失败,“对象引用未设置为对象的实例”。调试时Defaultsaved_stuff的所有其他成员变量都可见。

3 个答案:

答案 0 :(得分:7)

您必须将数组数据存储在自己的会话对象中:

MyClass[] my_array = //Something

Session["ArrayData"] = my_array;

然后将其检索为:

var arrayData = (MyClass[])Session["ArrayData"];

答案 1 :(得分:3)

根据MSDN,如果您将会话状态存储在内存中(默认值),则它不需要可序列化

  

使用除InProc以外的会话状态模式时,会话变量类型必须是原始.NET类型或可序列化。这是因为会话变量值存储在外部数据存储中。

我怀疑其他东西正在清理阵列。请记住

this.Session["This"] = this;

当使用内存中会话状态时,不会创建页面对象的副本,因此您对页面对象所做的任何更改(“this”)也将进行“已保存”的对象。因此,如果设置this._saved_stuff = null,则保存对象的属性也将为空。

我不会尝试将页面存储在会话中,而是选择要保存的值并明确保存它们。

此外,如果您希望在下一个回发中恢复这些值,您可能需要选择ViewState。使用Session确实会产生一些风险,即会话将在回发之间销毁。这可能很少见,但这是一种考虑因素。

答案 2 :(得分:1)

首先,您应该知道在Asp.net Web应用程序中有三种类型的会话状态 正在进行中 2.状态服务器 3.在数据库中

如果会话状态正在进行(可以是defalut),您可以将对象直接保存到会话中,或者您需要将对象标记为可序列化,这样您就可以将对象保存到状态服务器或数据库中(在配置文件中设置)