【问题标题】:How do I save an array of objects in a C# ASP.Net Sesssion?如何在 C# ASP.Net 会话中保存对象数组?
【发布时间】:2012-12-15 00:14:00
【问题描述】:

我的 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 中可见。

【问题讨论】:

  • Iserializable 无关紧要,因为您没有写入磁盘。你的数组真的很大,还是你花了很长时间来检索数据?可能是服务器超载了。似乎是一个很奇怪的问题。
  • @MrFox,数组有十几个元素,我正在开发我的开发机器,很抱歉没有超载。
  • 从会话中检索数组的代码是什么?你说它不起作用——但它是什么?
  • 啊,您从未直接存储或检索数组。这就是让我失望的原因。仍然如此,看看上面的内容。

标签: c# asp.net session


【解决方案1】:

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

MyClass[] my_array = //Something

Session["ArrayData"] = my_array;

然后将其检索为:

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

【讨论】:

  • 美丽。很高兴能帮上忙。
【解决方案2】:

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

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

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

this.Session["This"] = this;

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

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

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

【讨论】:

  • 感谢您的提示。我会检查的,但我怀疑我是否无意中清除了数组。这个问题会影响所有的类数组。本机类型、本机类型数组、结构体和结构体数组按照我的预期返回,但所有类数组都出现了这个问题。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    相关资源
    最近更新 更多