使用XmlSerializer忽略.NET中Xml序列化中某个属性的属性
本文关键字:属性 序列化 Xml XmlSerializer 忽略 NET 使用 | 更新日期: 2023-09-27 18:25:40
我正在使用XmlSerializer
执行Xml序列化。我正在执行ClassA
的序列化,其中包含类型为ClassB
的名为MyProperty
的属性。我不希望ClassB
的某个特定属性被序列化。
我必须使用XmlAttributeOverrides
,因为这些类在另一个库中。如果属性本身在ClassA
中,那么它将非常简单。
XmlAttributeOverrides xmlOver = new XmlAttributeOverrides();
XmlAttributes xmlAttr = new XmlAttributes();
xmlAttr.XmlIgnore = true;
xmlOver.Add(typeof(ClassA), "MyProperty", xmlAttr);
XmlSerializer ser = new XmlSerializer(typeof(ClassA), xmlOver);
如果属性在ClassB
中,并且我们需要序列化ClassA
,该如何实现?
您几乎得到了它,只需更新覆盖以指向ClassB
而不是ClassA
:
XmlAttributeOverrides xmlOver = new XmlAttributeOverrides();
XmlAttributes xmlAttr = new XmlAttributes();
xmlAttr.XmlIgnore = true;
//change this to point to ClassB's property to ignore
xmlOver.Add(typeof(ClassB), "ThePropertyNameToIgnore", xmlAttr);
XmlSerializer ser = new XmlSerializer(typeof(ClassA), xmlOver);
快速测试,给定:
public class ClassA
{
public ClassB MyProperty { get; set; }
}
public class ClassB
{
public string ThePropertyNameToIgnore { get; set; }
public string Prop2 { get; set; }
}
以及导出方法:
public static string ToXml(object obj)
{
XmlAttributeOverrides xmlOver = new XmlAttributeOverrides();
XmlAttributes xmlAttr = new XmlAttributes();
xmlAttr.XmlIgnore = true;
xmlOver.Add(typeof(ClassB), "ThePropertyNameToIgnore", xmlAttr);
XmlSerializer xs = new XmlSerializer(typeof(ClassA), xmlOver);
using (MemoryStream stream = new MemoryStream())
{
xs.Serialize(stream, obj);
return System.Text.Encoding.UTF8.GetString(stream.ToArray());
}
}
主要方法:
void Main()
{
var classA = new ClassA {
MyProperty = new ClassB {
ThePropertyNameToIgnore = "Hello",
Prop2 = "World!"
}
};
Console.WriteLine(ToXml(classA));
}
输出时省略"ThePropertyNameToIgnore":
<?xml version="1.0"?>
<ClassA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MyProperty>
<Prop2>World!</Prop2>
</MyProperty>
</ClassA>