如何序列化存储在Session中的ListItem

时间:2014-07-24 20:25:11

标签: c# asp.net session serialization listitem

我有这个代码在我的本地服务器上正常工作:

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”转换为实际上可序列化的值,然后将该值保存到会话中。但是,我的努力无济于事。序列化是最好的路线吗?找到一种不同的方式来存储这些数据?或其他什么?

2 个答案:

答案 0 :(得分:1)

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

序列化

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

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

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

我希望它有所帮助

答案 1 :(得分:1)

正如您所观察到的,

System.Web.UI.WebControls.ListItem不可序列化。因此,您无法将其存储在会话中。

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

但是,如果您想将问题和答案一起保存,则可以使用ListItem List<T> System.Tuple<string, string>,这是可序列化的,甚至是System.Web.UI.Pair,这也是可序列化的。

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

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