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

时间:2013-10-17 15:33:14

标签: c# .net xml xml-serialization xmlserializer

MSDN提供了一个很好的示例,说明如何使XmlSerializer类忽略要序列化的类中的属性:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore.aspx

我使用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);
}

然而,当我运行我的代码时,我得到的结果与我添加代码以忽略EntityKey之前得到的结果相同。我需要做些什么才能使XmlSerializer忽略要序列化的数组中每个对象的EntityKey?

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

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 and XmlType attributes may not be specified for the type 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声明属性或者它是一个复杂类型有关,而其他属性是基本类型。

2 个答案:

答案 0 :(得分:0)

您实际上并未指定要覆盖的属性类型。使用像

这样的东西
attributesToOverride.XmlArrayItems.Add(new XmlArrayItemAttribute("EntityKey", typeof(MyEntityObject[])));
overrides.Add(typeof(MyEntityObject), "EntityKey", attributesToOverride); // note "EntityKey" here

这很重要,因为否则它会认为你想忽略数组本身的EntityKey,但是由于它没有它,它不会忽略它。

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

答案 1 :(得分:0)

首先,您需要将覆盖附加到成员,而不仅仅是类型 - 有一个Add重载接受成员名称。

其次,声明此成员的是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);

然后有效。