【问题标题】:Can I store xmlDocument object in Session?How to do seralization?我可以在 Session 中存储 xmlDocument 对象吗?如何进行序列化?
【发布时间】:2012-01-19 06:58:08
【问题描述】:

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

当我尝试将它存储在 Session 中时,我收到了一个错误:

异常详细信息:System.Runtime.Serialization.SerializationException:在程序集“System.Xml,版本=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 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则同样的限制也适用。

【问题讨论】:

    标签: session xml-serialization serializable stateserver


    【解决方案1】:

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

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

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

    你可以从here得到快速的想法

    this过去的SO帖子也可能在一定程度上回答你的问题

    【讨论】:

    • 存储会话变量之前如何进行序列化?
    • 看看我在回答rtur.net/blog/post/2008/03/16/…中提供的链接
    • 按照此处显示的方式准备您的 xmlDocument,然后以您分配的类似方式将您新准备的 xmlDocument 对象分配给会话
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多