0

我有一个 XML 文档,我想将它存储在会话中,因此在每次回发时我不需要再次从其物理路径加载它。我们正在使用状态服务器。

当我尝试将其存储在 Session 中时,出现错误:

异常详细信息:System.Runtime.Serialization.SerializationException:在程序集“System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中键入“System.Xml.XmlDocument”未标记为可序列化。

我的代码是这样的:

string resumeSection = string.Empty;

resumeSection = resume.GetXMLSection(1)

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.LoadXml(resumeSection);

Session["USERXML"] = xmloc;

如何进行序列化?

当我遇到错误时, 无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。

4

2 回答 2

1

当您将任何对象存储在 Session 中时,它应该被标记[serealizable],因此您应该在将其存储到会话或视图状态之前序列化您的对象。

老实说,您不应该真正将复杂类型放入会话状态,您应该只存储简单类型或轻量级业务实体,而不是像XmlDocument.

我认为最好的方法是使用自定义序列化。如果类不是太大,您可以将 XmlDocument 持久化为字符串,然后在序列化实例时仅存储该值。然后,在反序列化时,您可以从SerializationInfo实例中提取它。

你可以从这里快速了解

这个过去的SO帖子也可能在某种程度上回答你的问题

于 2012-01-19T07:09:38.567 回答
0

我知道这已经 2 岁了,但是我自己也面临同样的问题,既然我找到了解决方案,我想与你分享。Devjosh 是对的,我们不应该在会话中存储复杂的对象,但有时它非常有用,所以很高兴知道有解决方案。

我注意到,如果您存储像 xml/dataset/class 这样的对象,您可能会遇到此错误。我试图将它存储为通用对象并且似乎可以工作。在存储数据集的同一代码上,我遇到了错误,通过存储在通用对象中,工作正常。

这是一个简化的示例:

    public static void InsertSessionObject(string item, object obj)
    {
        HttpContext.Current.Session.Add(item, obj);
    }

    public static object GetSessionObject(string item)
    {
        return HttpContext.Current.Session[item];
    }

    public static void RemoveSessionObject(string item)
    {
        HttpContext.Current.Session.Remove(item);
    }

    DataSet lastResults = GetDatasetResults();

    InsertSessionObject("myDataset", lastResults);

    lastResults = (DataSet)GetSessionObject("myDataset");

    RemoveSessionObject("myDataset");
于 2014-12-09T08:21:35.153 回答