我有这个代码在我的本地服务器上正常工作:
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”转换为实际上可序列化的值,然后将该值保存到会话中。但是,我的努力无济于事。序列化是最好的路线吗?找到一种不同的方式来存储这些数据?或其他什么?
答案 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
- questions
和answers
的两个数据属性分别保存到Session中,还有{{{ 1}}本身。在我看来,拥有ListItem
和questions
,您就拥有了重建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; }
}