C# 如何使XmlSerializer忽略要序列化的数组中的属性?

C# 如何使XmlSerializer忽略要序列化的数组中的属性?,c#,.net,xml,xml-serialization,xmlserializer,C#,.net,Xml,Xml Serialization,Xmlserializer,MSDN为如何使XmlSerializer类忽略要序列化的类中的属性提供了一个很好的示例: 我正在使用XmlSerializer类序列化从EntityObject类继承的对象数组,我希望XmlSerializer忽略EntityKey属性。我编写了以下代码: private void setupXmlSerializer() { XmlAttributeOverrides overrides = new XmlAttributeOverrides(); X

MSDN为如何使XmlSerializer类忽略要序列化的类中的属性提供了一个很好的示例:

我正在使用XmlSerializer类序列化从EntityObject类继承的对象数组,我希望XmlSerializer忽略EntityKey属性。我编写了以下代码:

private void setupXmlSerializer()
{            
    XmlAttributeOverrides overrides = new XmlAttributeOverrides();
    XmlAttributes attributesToOverride = new XmlAttributes();
    attributesToOverride.XmlIgnore = true;            
    overrides.Add(typeof(MyEntityObject), "EntityKey", attributesToOverride);
    completeXmlSerializer = new XmlSerializer(typeof(MyEntityObject[]), overrides);
}
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributesToOverride = new XmlAttributes();
attributesToOverride.XmlIgnore = true;                        
attributesToOverride.XmlArrayItems.Add(new XmlArrayItemAttribute("EntityKey", typeof(MyEntityObject[])));
overrides.Add(typeof(MyEntityObject), attributesToOverride);
completeXmlSerializer = new XmlSerializer(typeof(MyEntityObject[]), overrides);
但是,当我运行代码时,得到的结果与我添加忽略EntityKey的代码之前得到的结果相同。我需要做什么才能使XmlSerializer忽略要序列化的数组中每个对象的EntityKey

编辑:为了回应我收到的答案,我尝试编写以下代码:

private void setupXmlSerializer()
{            
    XmlAttributeOverrides overrides = new XmlAttributeOverrides();
    XmlAttributes attributesToOverride = new XmlAttributes();
    attributesToOverride.XmlIgnore = true;            
    overrides.Add(typeof(MyEntityObject), "EntityKey", attributesToOverride);
    completeXmlSerializer = new XmlSerializer(typeof(MyEntityObject[]), overrides);
}
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributesToOverride = new XmlAttributes();
attributesToOverride.XmlIgnore = true;                        
attributesToOverride.XmlArrayItems.Add(new XmlArrayItemAttribute("EntityKey", typeof(MyEntityObject[])));
overrides.Add(typeof(MyEntityObject), attributesToOverride);
completeXmlSerializer = new XmlSerializer(typeof(MyEntityObject[]), overrides);
当我运行这段代码时,我得到一个异常:
XmlRoot和XmlType属性可能没有为类型MyNamespace.MyEntityType指定

再次编辑:我已经编写了以下代码,可以运行,但不会忽略EntityKey。我想知道这是否与实体框架设计类的方式有关

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributesToOverride = new XmlAttributes();            
attributesToOverride.XmlArrayItems.Add(new XmlArrayItemAttribute("EntityKey", typeof(EntityType[])));
attributesToOverride.XmlIgnore = true;                        
overrides.Add(typeof(EntityType), "EntityKey", attributesToOverride);            
completeXmlSerializer = new XmlSerializer(typeof(EntityType[]), overrides);
编辑:我不知道这是否相关,但EntityKey属性在EntityObject抽象类中声明,具有以下属性:

[DataMember]
[Browsable(false)]
public EntityKey EntityKey { get; set; }
还有第二个名为EntityState的属性,它是用XmlIgnore声明的,所以我不必忽略它

[XmlIgnore]
[Browsable(false)]
public EntityState EntityState { get; }

编辑:我有一个发现。如果我试图忽略EntityObject上的一个实际数据属性,它就可以正常工作。我想知道它是否与EntityKey是用属性声明的,或者它是一个复杂类型,而其他属性是基本类型有关。

您实际上没有指定要覆盖的属性的类型。使用类似

attributesToOverride.XmlArrayItems.Add(new XmlArrayItemAttribute("EntityKey", typeof(MyEntityObject[])));
overrides.Add(typeof(MyEntityObject), "EntityKey", attributesToOverride); // note "EntityKey" here
这一点很重要,因为否则它会认为您希望忽略数组本身上的EntityKey,但因为它没有EntityKey,所以不会忽略它

[XmlIgnore]
[Browsable(false)]
public EntityState EntityState { get; }

--更新以显示第二行更改

首先,您需要将覆盖附加到成员,而不仅仅是类型-存在接受成员名称的
添加
重载

其次,声明此成员的是
EntityObject
,您需要将覆盖附加到声明类型

把这些放在一起:

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributesToOverride = new XmlAttributes();
attributesToOverride.XmlIgnore = true;
overrides.Add(typeof(EntityObject), "EntityKey", attributesToOverride);
var completeXmlSerializer = new XmlSerializer(
      typeof(MyEntityObject[]), overrides);

这就行了。

关于忽略属性的属性,有一个类似的问题,可能是相关的:我已经尝试过了,但它仍然序列化了EntityKey属性。我怀疑这与上面的文章类似,因为您的代码传入了一个空的属性集合,因此没有一个属性被覆盖。请看下面的示例,它首先显示添加一些属性: