我在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
的所有其他成员变量都可见。
答案 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),您可以将对象直接保存到会话中,或者您需要将对象标记为可序列化,这样您就可以将对象保存到状态服务器或数据库中(在配置文件中设置)