C# 如何使序列化对象看起来与其相同';是原始的xml文件吗?

C# 如何使序列化对象看起来与其相同';是原始的xml文件吗?,c#,xml,serialization,xsd,C#,Xml,Serialization,Xsd,我有一个由外部公司定义的xsd文件,我使用它与xsd.exe一起生成类。我可以使用提供的xml文件使用生成的类将其反序列化为对象,但在某些情况下,我需要将xml的较小部分作为XDocument。在运行时之前,我不知道这些部分中的路径,因此我将xml用于: XElement element = xml.XPathSelectElement(path); 我遇到的问题是序列化结果与传入的xml不完全匹配,这使得select返回null。如何使序列化对象看起来像传入文件?我是否可能使用xsd.exe

我有一个由外部公司定义的xsd文件,我使用它与xsd.exe一起生成类。我可以使用提供的xml文件使用生成的类将其反序列化为对象,但在某些情况下,我需要将xml的较小部分作为XDocument。在运行时之前,我不知道这些部分中的路径,因此我将xml用于:

XElement element = xml.XPathSelectElement(path);
我遇到的问题是序列化结果与传入的xml不完全匹配,这使得select返回null。如何使序列化对象看起来像传入文件?我是否可能使用xsd.exe错误地生成了类?我最终需要使用相同的生成代码来生成自己的xml文件

下面是我当前用于序列化的代码

var xml = new XDocument();
using (var writer = xml.CreateWriter())
{
    List<Type> known = new List<Type>();
    known.Add(typeof(ObjType1));
    ...
    var serializer = new DataContractSerializer(typeof(Detail), known);
    serializer.WriteObject(writer, sourceDetailObj);
}

Obj可以是几个类中的一个。

使用
DataContractSerializer
的问题是,它针对在WCF服务之间发送消息进行了优化,并且不一定会生成与
XmlSerializer
相同的“经典”xml

特别是,
XmlSerializer
将序列化所有公共成员,除非您告诉它不要序列化,但是对于
DataContractSerializer
它将不会序列化,除非您告诉它。这有助于加快WCF的速度;你只会得到你想要的


因此,如果您没有为WCF服务生成XML,我建议您使用
XmlSerialiser

快速尝试的方法(如果您还没有)是使用
XmlSerializer
而不是
DataContractSerializer
,看看这是否解决了您的问题。它们不一定产生相同的输出。@DeanOC是的,这就解决了它!这就产生了与源文件几乎相同的xml.Cool。我会加上它作为答案。
<Detail xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CustomNameSpace">
    ...
    <numberField>1</numberField>
    <detailTypeField>
        <objField i:type="ObjType1">
            <valObjField i:nil="true" />
            ...
        </objField>
    </detailTypeField>
    ...
</Detail>
<Detail>
    ...
    <Number>1</Number>
    <DetailType>
        <ObjType1>
            ...
        </ObjType1>
    </DetailType>
    ...
</Detail>
public partial class DetailType {

    private object objField;

    [System.Xml.Serialization.XmlElementAttribute("ObjType1", typeof(ObjType1))]
    ...
    public object Obj {
        get {
            return this.objField;
        }
        set {
            this.objField = value;
        }
    }
}