如何通过XmlElement名称从序列化中排除类字段?

myW*_*SON 1 .net c# xml serialization

假设我们有一个类:

using System;
using System.Xml.Serialization;

namespace XmlEntities {
    [XmlRoot("Agent")]
    public class RootClass {
        private string element_description;

        [XmlElement("Name")]
        public string Name{ get; set; }
        }

        [XmlElement("Surname")]
        public string Surname{ get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们只想将NamexmlElement 序列化为xml .如何限制序列化?

Ben*_*Ben 6

你遇到过[XmlIgnore]属性吗?将其添加到类的成员将从序列化中排除它们.

因此,例如,您可以替换[XmlElement("Surname")][XmlIgnore],然后您的序列化代理将如下所示:

<Agent>
    <Name>John Doe</Name>
</Agent>
Run Code Online (Sandbox Code Playgroud)

或者,如果您真正想要的只是<Name>John Doe</Name>,您可以编写一个包装类:

[XmlRoot("Name")]
public class NameElement
{
    [XmlText]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

*编辑*

虽然可以在运行时生成这样的包装器,但它很难,效率低,而且不太实用.

为此,我猜你可以反思地检查你的对象并找到你想要的属性(root.GetType().GetProperties().Where(p => /* your logic here */)),并使用System.Reflection.Emit来生成适当的类.虽然可能,但这是不合理的 - 它相对于您的实际逻辑而言是大量代码,并且您可能很容易破坏运行时的稳定性和/或泄漏内存.

实现所需动态的更好方法是放弃System.Xml.Serialization和使用System.Xml.Linq.这需要你自己编写构建xml的代码,但它非常简单:

public XElement ConvertToXml(RootClass root)
{
    return new XElement("Name", root.Name);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用XElement上的element.Save(Stream)实例方法将XElement写入任何流.

在MSDN上阅读有关Linq to XML的更多信息