如何使序列化的对象看起来与它的原始源xml文件相同?

本文关键字:xml 文件 原始 序列化 何使 对象 看起来 | 更新日期: 2023-09-27 18:10:48

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

XElement element = xml.XPathSelectElement(path);

我遇到的问题是,序列化的结果不匹配传入的xml相当正确,这使得选择返回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);
}

序列化的结果:

<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>
下面是xsd生成的一个类:
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;
        }
    }
}

Obj可以是几个类中的一个

如何使序列化的对象看起来与它的原始源xml文件相同?

使用DataContractSerializer的问题是,它是为在WCF服务之间发送消息而优化的,并且不一定会产生与XmlSerializer相同的"经典" xml。

特别地,XmlSerializer将序列化所有的public成员,除非你告诉它不要序列化,但是对于DataContractSerializer,除非你告诉它不要序列化,否则它不会序列化。这样做是为了让WCF更快;你只会得到你想要的。

因此,如果您不为WCF服务生成XML,我建议您使用XmlSerialiser代替。