2009-10-19 46 views
1

我从XML中的Web服务接收数据,并通过对象使用这些数据,建立在收到的XML上。所以,有时我需要在会话中的请求之间存储这些用户特定的对象。我知道的XMLDocument无法明确(状态服务器),存储...所以我做了可怕的建设,如:如何保持会话基于XML的对象?

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字符串,每次我需要从该类的任何属性获取一些数据。有什么办法吗?)谢谢。

+0

为什么XMLDocument无法显式存储在Session中?如果它很大,这不是一个好主意,但将它作为字符串存储也不是一个好主意。 – 2009-10-19 17:12:02

+0

我忘了提及我使用状态服务器...所以我不能把XMLDocument放在那里。 是的,这不是有效的存储方式...但对我来说有一些关键的好处) – 2009-10-19 17:51:24

回答

2

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

我认为你最好的选择是优化你目前的策略。您是否确保XMLDocument在每个请求期间仅重构一次?根据XML数据的实际使用情况,使用XMLReader可能会更有效率,而不是构建XMLDocument。

+0

是的... aybe一些优化)但是XMLReader不是那么容易使用)我更喜欢用xpath或linq轻松提取。 ..所以我需要XMLDocument或XDocument。 问题正是 - XMLDocument现在构造每次我得到该类的任何属性......并且我无法将构造的文档存储在类变量中,因为类将立即变为不可序列化) – 2009-10-19 18:52:46

+0

如果您使用BinaryFormatter或SoapFormatter来序列化对象,然后将@NonSerialized属性放在成员上会阻止.Net试图序列化该成员。 – jthg 2009-10-19 19:37:25