1

假设我们有一个像这样的类:

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; }
    }
}

而且我们只想序列化成xml NameXmlElement。如何在序列化时限制它?

4

2 回答 2

6

你遇到过[XmlIgnore]属性吗?将其添加到您的班级成员中会将他们排除在序列化之外。

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

<Agent>
    <Name>John Doe</Name>
</Agent>

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

[XmlRoot("Name")]
public class NameElement
{
    [XmlText]
    public string Name { get; set; }
}

* 编辑 *

虽然可以在运行时生成这样的包装器,但它是困难的、低效的并且不是很实用。

为此,我想您可以反思性地检查您的对象并找到您想要的属性 ( 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);
}

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

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

于 2013-06-13T22:28:52.707 回答
3

如果要在运行时忽略元素,在序列化时,可以使用 XmlAttributeOverrides:

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = true;
attribs.XmlElements.Add(new XmlElementAttribute("Surname"));
overrides.Add(typeof(RootClass), "Surname", attribs);

XmlSerializer ser = new XmlSerializer(typeof(RootClass), overrides);
RootClass agent = new RootClass();
agent.Name = "Marc";
agent.Surname = "Jobs";
ser.Serialize(Console.Out, agent);
于 2013-06-13T23:57:21.470 回答