Session 我可以在会话中存储xmlDocument对象吗?如何进行序列化?

Session 我可以在会话中存储xmlDocument对象吗?如何进行序列化?,session,xml-serialization,serializable,stateserver,Session,Xml Serialization,Serializable,Stateserver,我有一个XML文档,我想将它存储在会话中,所以在每次回发时,我不需要再次从物理路径加载它。我们正在使用状态服务器 当我试图将其存储在会话中时,我收到一个错误: 异常详细信息:System.Runtime.Serialization.SerializationException:程序集中的'System.Xml.XmlDocument'类型,版本=2.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089'未标记为可序列化 我的代码是这样的: string res

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

当我试图将其存储在会话中时,我收到一个错误:

异常详细信息:System.Runtime.Serialization.SerializationException:程序集中的'System.Xml.XmlDocument'类型,版本=2.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089'未标记为可序列化

我的代码是这样的:

string resumeSection=string.Empty

resumeSection = resume.GetXMLSection(1)

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.LoadXml(resumeSection);

Session["USERXML"] = xmloc;
怎么做

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

在会话中存储任何对象时,应将其标记为
[serealizable]
,以便在将对象存储到会话或viewstate之前对其进行序列化

老实说,您不应该真的将复杂类型放入会话状态 您应该只存储简单类型或轻型业务实体 不是像
XmlDocument
这样的对象

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

你可以很快从你的朋友那里得到主意


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

我知道这是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");

如何在存储会话变量之前进行序列化?请查看我在回答中提供的链接,以此处所示的方式准备xmlDocument,然后以分配给会话的类似方式将新准备的xmlDocument对象分配给会话