C# 序列化时XmlSerializer忽略属性重写
我有一个复杂的图形,每个属性都有一个自定义属性。拥有对象后,我将遍历属性,检查自定义属性,如有必要,添加要忽略的属性:C# 序列化时XmlSerializer忽略属性重写,c#,xml,C#,Xml,我有一个复杂的图形,每个属性都有一个自定义属性。拥有对象后,我将遍历属性,检查自定义属性,如有必要,添加要忽略的属性: var ignoreAttribute = new XmlAttributes() { XmlIgnore = true }; var overrides = new XmlAttributeOverrides(); var objType = obj.GetType(); var properties = objType.GetProperties(); fore
var ignoreAttribute = new XmlAttributes() {
XmlIgnore = true
};
var overrides = new XmlAttributeOverrides();
var objType = obj.GetType();
var properties = objType.GetProperties();
foreach (var property in properties)
{
var attrib = property.GetCustomAttribute<ExportLevelAttribute>();
if (!attrib.Values.Contains(level))
{
try
{
var element = property.GetCustomAttribute<XmlElementAttribute>();
var name = element?.ElementName == string.Empty ? property.Name : element.ElementName;
overrides.Add(property.PropertyType, name, ignoreAttribute);
}
catch { }
continue;
}
}
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream, new UTF8Encoding(false)))
{
var xml = new XmlSerializer(typeof(MyRootObject), overrides);
xml.Serialize(writer, obj);
return Encoding.UTF8.GetString(stream.ToArray());
}
var ignoreAttribute=new xmltattributes(){
XmlIgnore=true
};
var overrides=new XmlAttributeOverrides();
var objType=obj.GetType();
var properties=objType.GetProperties();
foreach(属性中的var属性)
{
var attrib=property.GetCustomAttribute();
如果(!attrib.Values.Contains(级别))
{
尝试
{
var元素=property.GetCustomAttribute();
var name=element?.ElementName==string.Empty?属性。名称:element.ElementName;
overrides.Add(property.PropertyType、name、ignoreAttribute);
}
捕获{}
继续;
}
}
使用(var stream=new MemoryStream())
使用(var writer=newstreamwriter(stream,newutf8encoding(false)))
{
var xml=新的XmlSerializer(typeof(MyRootObject),重写);
Serialize(writer,obj);
返回Encoding.UTF8.GetString(stream.ToArray());
}
正在将属性添加到替代中。但是,序列化时,设置为忽略的属性仍在序列化
我遗漏了什么吗?传递到
XmlAttributeOverrides的类型。Add
在对象
级别工作,而不是成员
级别:
因此,添加替代时,请指定先前获得的对象类型:
overrides.Add(objType, name, ignoreAttribute);
很有魅力!!重要提示:使用XmlAttributeOverrides
时,每次newxmlserializer(…)
时都会生成一个新的序列化程序集。因此:如果要避免内存流失(可运行程序集通常不可收集),必须存储并重用XmlSerializer
实例@marcGravel谢谢您的提示!