DataContractSerializer-如何使用ElementName而不是属性名称序列化对象?

时间:2018-08-03 14:08:14

标签: c# xml datacontractserializer

使用DataContractSerializer时遇到序列化问题。我面临的问题是,生成的XML文件始终具有为类和字段定义名称的标签,而不是使用XmlRoot属性在XmlElementElementName中设置的名称。例如对于定义如下的类:

[XmlRoot(ElementName = "customer")]
public class Customer
{
    [XmlElement(ElementName = "name")]
    public string Name { get; set; }
    [XmlElement(ElementName = "address")]
    public string Address { get; set; }
}

在我看来,生成的XML始终是:

<Customer>
    <Name>abc</Name>
    <Address>xyz</Address>
</Customer>

我想要获得的输出是使用ElementName小写的输出:

<customer>
    <name>abc</name>
    <address>xyz</address>
</customer>

我正在使用扩展方法通过C#对象使用以下方法进行序列化:

public static XDocument SerializeToXElement(object o)
{
    XDocument doc = new XDocument();

    using (var writer = doc.CreateWriter())
    {
        var serializer = new DataContractSerializer(o.GetType());
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        serializer.WriteObject(writer, o);
    }

    doc.StripNamespace();

    return doc;
}

我的序列化函数中还调用了另一个扩展方法,以从我的XDocument中剥离名称空间,如下所示:

public static void StripNamespace(this XDocument document)
{
    if (document.Root == null) return;

    foreach (var element in document.Root.DescendantsAndSelf())
    {
        element.Name = element.Name.LocalName;
        element.ReplaceAttributes(GetAttributesWithoutNamespace(element));
    }
}

我该怎么做才能使DataContractSerializer使用ElementName代替类/属性名称?

2 个答案:

答案 0 :(得分:0)

这应该对您有用,

[XmlRoot("customer")]
public class Customer
{
    [XmlElement("name")]
    public string Name { get; set; }
    [XmlElement("address")]
    public string Address { get; set; }
}

答案 1 :(得分:0)

根据我的评论,您应该use DataContract and DataMember attributes而不是XmlRootXmlElement

[DataContract(Name = "customer", Namespace = "")]
public class Customer
{
    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "address")]
    public string Address { get; set; }
}