【问题标题】:How to Serialize a ListItem Stored in Session如何序列化存储在 Session 中的 ListItem
【发布时间】:2014-07-24 20:25:10
【问题描述】:

我的代码在我的本地服务器上运行良好:

if (Page.IsPostBack)
{
    string[] questions = new string[20];
    string[] answers = new string[20];
    for (int i = 0; i < lstQuestions.Items.Count; ++i)
    {
        questions[i] = lstQuestions.Items[i].Text;
        answers[i] = lstQuestions.Items[i].Value;
    }
    Session["questions"] = questions;
    Session["answers"] = answers;
    if (Session["qalist"] == null)
    {
        List<ListItem> qalist = lstQuestions.Items.Cast<ListItem>().ToList();
        Session["qalist"] = qalist;
    }
    else
    {
        List<ListItem> qalist = (List<ListItem>)Session["qalist"];
        lstQuestions.DataSource = qalist;
    }
}

else
{
    if (Session["questions"] != null && Session["answers"] != null && Session["qalist"] != null)
    {
        List<ListItem> qalist = (List<ListItem>)Session["qalist"];
        foreach (ListItem item in qalist)
        {
            lstQuestions.Items.Add(new ListItem(item.Text, item.Value.ToString()));
        }
    }
}

但是,当我访问 Web 服务器时,我收到错误“System.Web.UI.WebControls.ListItem,未标记为可序列化”。我研究了如何使这个可序列化,甚至如何将“qalist”转换为实际上可序列化的值,然后将该值保存到会话中。然而,我的努力并没有奏效。序列化是最好的途径吗?寻找不同的方式来存储这些数据?还是别的什么?

【问题讨论】:

  • 很简单。 “不要这样做”。 ListItem 不可序列化,因此您必须在 Session 中存储足够的数据,以便在需要时创建 ListItem。

标签: c# asp.net session serialization listitem


【解决方案1】:

System.Web.UI.WebControls.ListItem 不可序列化,正如您所观察到的。因此您不能将其存储在会话中。

我有点困惑,为什么您要将 ListItem 的两个数据属性 - questions 和 answers - 分别保存到 Session 以及 ListItem 本身。在我看来,拥有questions 和answers,你就拥有了重建ListItem 所需的一切。

但如果你想将你的问题和答案作为一对保存在一起,你可以使用System.Tuple&lt;string, string&gt; 的List&lt;T&gt;,它是可序列化的,甚至是System.Web.UI.Pair,它也是可序列化的。

您也可以编写自己的(非常简单的)类,并将其标记为可序列化:

[Serializable]
public class QuestionAndAnswer
{
    public string Question { get; set;}
    public string Answer { get; set; }
}

【讨论】:

  • 来自Session["questions"]、Session["answers"] 和Session["qalist"] 的文本都填充了不同的项目并用于多个目的。如果不显示一堆不必要的代码就很难解释,所以我不会详细介绍它们的确切功能。谢谢你的回答,我试试看。
  • 我想我会回答并说我接受了你的建议,它确实有效。如果有人需要比较以供将来参考,这就是我的结尾:在进入for 循环之前-List&lt;Tuple&lt;string, string&gt;&gt; qatuple = new List&lt;Tuple&lt;string, string&gt;&gt;(); 在for 循环中-qatuple.Add(new Tuple&lt;string, string&gt;(questions[i], answers[i])); 在for 循环之后-Session["qatuple"] = qatuple; qatuple = (List&lt;Tuple&lt;string, string&gt;&gt;)Session["qatuple"]; lstQuestions.DataSource = qatuple;
【解决方案2】:

您可以尝试使用 JSON.Net (Newtonsoft) 进行序列化和反序列化。

序列化

Session["qalist"] = JsonConvert.SerializeObject(lstQuestions);

反序列化(T是lstQuestions的类型)

lstQuestions = JsonConvert.DeserializeObject<T>(Session["qalist"]);

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2021-12-17
    • 2010-12-06
    • 2018-08-15
    • 2019-10-15
    相关资源
    最近更新 更多