即时反序列化,或LINQ to XML

时间:2012-04-04 16:03:58

标签: c# model-view-controller xml-serialization linq-to-xml

使用C#Visual Studio 2008,MVC1。

我正在通过从WebService中获取一个xml文件并向其添加一些节点来创建它。现在我想将它反序列化为一个类,该类是用于强化视图的模型。

首先,我面临的问题是在没有将xml存储在文件系统中的情况下实现这一点,因为我不知道这是如何序列化和反序列化工作的。我想有一种方法,这只是一个时间问题。

但是,在网上搜索我之前的LINQ to XML,现在我怀疑是否更好地使用它。

xml将由一些客户端细节构成,基本上我将使用所有这些。

任何提示?

谢谢!

3 个答案:

答案 0 :(得分:1)

试试这个:

XmlSerializer xmls = new XmlSerializer(typeof(XElement)); 
FileStream FStream;
try 
{             
   FStream = new FileStream(doctorsPath, FileMode.Open);
  _Doctors = (XElement)xmls.Deserialize(FStream); FStream.Close(); 
   FStream = new FileStream(patientsPath, FileMode.Open); 
  _Patients = (XElement)xmls.Deserialize(FStream)
   FStream.Close(); 
   FStream = new FileStream(treatmentsPath, FileMode.Open);
  _Treatments = (XElement)xmls.Deserialize(FStream);
    FStream.Close(); 
} 
catch 

{ }

这会将所有XML文件加载到我们的XElement变量中。 try-catch块是一种异常处理形式,它确保如果try块中的一个函数抛出异常,程序将跳转到catch部分,不会发生任何事情。使用文件时,特别是阅读文件时,最好使用try-catch。

答案 1 :(得分:1)

您可以在MemoryStream之间保存XElement(无需将其保存到文件流中)

 MemoryStream ms = new MemoryStream();
 XmlWriter xw = XmlWriter.Create(ms);
 document.Save(xw);
 xw.Flush();

然后,如果将位置重置为0,则可以使用DataContractSerializer对其进行反序列化。

 ms.Position = 0;
 DataContractSerializer serializer = new DataContractSerializer(typeof(Model));
 Model model = (model) serializer.ReadObject(ms);

序列化的工作方式还有其他选择,所以如果这不是你所拥有的,请告诉我你在使用什么,我会帮助你。

答案 2 :(得分:1)

LINQ to XML是一个很棒的功能。你总是可以依靠它。您无需从文件中写入或读取数据。您可以指定字符串或流到XDocument

有足够的方法将XML元素加载到XDocument对象。 See the appropriate Load functions。加载内容后,您可以轻松添加/删除元素,以后可以根据需要保存到磁盘。