【问题标题】:How to keep in session XML-based objects?如何在会话中保留基于 XML 的对象?
【发布时间】:2009-10-19 17:03:50
【问题描述】:

我以 XML 格式从 Web 服务接收数据,并且我通过对象使用该数据,建立在收到的 XML 之上。因此,有时我需要在会话中的请求之间存储此类特定于用户的对象。我知道 XMLDocument 不能被显式存储(状态服务器)......所以我做了一个糟糕的结构,比如:

private string _data;
public XmlDocument Data
{
    get
    {
        XmlDocument res = new XmlDocument();
        if (!string.IsNullOrEmpty(_data))
        {
            res.InnerXml = _data;
            return res;
        }
        return null;
    }
    set { _data = value.InnerXml; }
} 

所以我隐式存储了 xml……它在开发过程中对我很有用,因为我不确切知道我需要整个对象的哪些属性 - 我可以在紧要关头使用 xpath 等制作简单的实验属性……

所以这对我来说很舒服,但是每次我需要从该类的任何属性中获取一些数据时,从字符串构造 xmldocument 看起来效率很低。有什么办法吗?)谢谢。

【问题讨论】:

  • 为什么不能将 XMLDocument 显式存储在 Session 中?如果它很大,则不是一个好主意,但将其存储为字符串也不是一个好主意。
  • 我忘了提到我正在使用状态服务器......所以我不能把 XMLDocument 放在那里。是的,这不是一种有效的存储方式……但对我来说有一些关键的好处)

标签: asp.net xmldocument linq-to-xml


【解决方案1】:

如果您需要跨请求存储数据,那么在每个请求期间确实无法绕过对数据进行序列化和反序列化 - 除了一个例外。如果您使用进程内会话,则可以存储您想要的任何对象,包括 XMLDocument 对象,甚至(请原谅我提到这一点)打开的文件句柄和数据库连接。我不建议让您的应用程序依赖于进程内会话,因为如果有必要,它将消除将应用程序放入网络场的可能性。

我认为您最好的选择是优化您当前的策略。您是否确保 XMLDocument 在每个请求期间仅重建一次?与构造 XMLDocument 相比,使用 XMLReader 可能更有效,具体取决于 XML 数据的实际使用方式。

【讨论】:

  • 是的...也许是一些优化)但是 XMLReader 不是那么容易使用)我更喜欢使用 xpath 或 linq 轻松提取...所以我需要 XMLDocument 或 XDocument。确切的问题是 - XMLDocument 现在每次我获取类的任何属性时都会构造......并且我不能将构造的文档存储在类变量中,因为类将立即变得不可序列化)
  • 如果您使用 BinaryFormatter 或 SoapFormatter 来序列化对象,那么将 @NonSerialized 属性放在成员上会阻止 .Net 尝试序列化该成员。
猜你喜欢
  • 2018-05-22
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2015-07-11
  • 1970-01-01
  • 2016-10-08
相关资源
最近更新 更多