如何序列化存储在会话中的列表项

本文关键字:列表 会话 序列化 存储 | 更新日期: 2023-09-27 18:14:35

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

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["answerswers"] = 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["answerswers"] != 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"。未标记为"可序列化"的列表项。我已经研究了如何使其可序列化,或者甚至如何将"qalist"转换为实际上可序列化的值,然后将该值保存到会话中。然而,我的努力无济于事。连载是最好的途径吗?找到一种不同的方式来存储这些数据?还是别的什么?

如何序列化存储在会话中的列表项

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

我有点困惑为什么你要保存ListItem的两个数据属性- questionsanswers -分别进入会话,以及ListItem本身。在我看来,有了questionsanswers,你就有了重建ListItem所需的一切。

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

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

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

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

序列化

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

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

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

希望能有所帮助