如何序列化存储在会话中的列表项
本文关键字:列表 会话 序列化 存储 | 更新日期: 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
的两个数据属性- questions
和answers
-分别进入会话,以及ListItem
本身。在我看来,有了questions
和answers
,你就有了重建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"]);
希望能有所帮助