找到了一种方法来做到这一点。它有它的结果,但一旦你把所有的东西都包括进来,它的工作非常顺利。
要生成的XML:
DataContractSerializer ser = new DataContractSerializer(typeof(Project));
StringBuilder objectSB = new StringBuilder();
XmlWriter objectWriter = XmlWriter.Create(objectSB);
//I'm using this method in the object I want to serialize (hence the 'this')
ser.WriteObject(objectWriter, this);
objectWriter.Flush();
然后你就可以把StringBuilder的成Linq的一个的XElement为XML:
Xelement xProject = Xelement.Parse(objectSB.ToString());
反序列化:
DataContractSerializer ser = new DataContractSerializer(typeof(Project));
Project project = (CoilProject)ser.ReadObject(xProject.CreateReader());
有有几次我使用Linq to XML编辑XML而没有反序列化和重新序列化。由于该DataContractSerializer的增加了命名空间,这成为必要:
//place this somewhere in your project's namespace
public static class MyExtensions
{
public static IEnumerable<XElement> ElementsAnyNS(this XElement source, string localName)
{
return source.Elements().Where(e => e.Name.LocalName == localName);
}
public static XElement ElementAnyNS(this XElement source, string localName)
{
return source.Elements().Where(e => e.Name.LocalName == localName).Select(e => e).Single();
}
}
这些扩展方法可以让你选择从序列化对象的一个或多个元素,而不必担心命名空间。我改编了Pavel Minaev's answer上的这些扩展方法Ignore namespaces in LINQ to XML。