6

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

这是失败的“对象引用未设置为对象的实例”。的所有其他成员变量在调试时Default可见。saved_stuff

4

3 回答 3

7

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

MyClass[] my_array = //Something

Session["ArrayData"] = my_array;

然后将其检索为:

var arrayData = (MyClass[])Session["ArrayData"];
于 2012-12-14T15:58:12.547 回答
3

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

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

我怀疑其他东西正在清除数组。请记住

this.Session["This"] = this;

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

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

此外,如果您希望在下一次发中可以恢复这些值,您可能需要选择ViewState。使用Session确实存在会话在回发之间被破坏的风险。这可能很少见,但这是一个考虑因素。

于 2012-12-14T15:40:55.193 回答
1

首先你应该知道,在 Asp.net Web 应用程序中有三种类型的 Session State 1. in process 2. State Server 3. In Database

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

于 2012-12-14T15:42:30.603 回答