C# DataContractSerializer序列化到特定xml节点

C# DataContractSerializer序列化到特定xml节点,c#,xml,linq-to-xml,datacontractserializer,C#,Xml,Linq To Xml,Datacontractserializer,我想提供一种在应用程序中保存工作的方法。这是一种项目功能。这些项目需要序列化为XML。我已经让DataContractSerializer生成了XML,但是我需要能够在XML文件中选择一个位置进行序列化,而不是为自己编写一个完整的文件,因为将有多个项目,并且我需要能够从一个项目XML文件中分别对这些项目进行反序列化 我想要什么样的XML: <Projects> <Project> <ID>...</ID> &

我想提供一种在应用程序中保存工作的方法。这是一种项目功能。这些项目需要序列化为XML。我已经让DataContractSerializer生成了XML,但是我需要能够在XML文件中选择一个位置进行序列化,而不是为自己编写一个完整的文件,因为将有多个项目,并且我需要能够从一个项目XML文件中分别对这些项目进行反序列化

我想要什么样的XML:

<Projects>
    <Project>
        <ID>...</ID>
        <Name>...</Name>
        <LastEdited>...</LastEdited>
        ...
    </Project>
    <Project>...</Project>
    <Project>...</Project>
</Projects>

...
...
...
...
...
...
然后,我将使用LINQtoXML根据项目ID进行序列化和反序列化,以导航文档


有什么建议吗?非常感谢。

找到了这样做的方法。它有它的缺点,但一旦你把所有的东西都包括进去,它就会非常顺利地工作

要生成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 to XML的XElement:

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();
    }
}
//将其放在项目名称空间的某个位置
公共静态类MyExtensions
{
公共静态IEnumerable元素SANYNS(此元素源,字符串localName)
{
返回source.Elements()。其中(e=>e.Name.LocalName==LocalName);
}
公共静态XElement ElementAnyNS(此XElement源,字符串localName)
{
返回source.Elements().Where(e=>e.Name.LocalName==LocalName).Select(e=>e.Single();
}
}
这些扩展方法允许您从序列化对象中选择一个或多个元素,而无需担心名称空间。我从一开始就采用了这些扩展方法