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 .如何限制序列化?
你遇到过[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的更多信息