Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化时XmlSerializer忽略属性重写_C#_Xml - Fatal编程技术网

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谢谢您的提示!