1

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 或它是复杂类型而其他属性是原始类型有关。

4

2 回答 2

0

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

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

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

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

于 2013-10-17T15:46:48.267 回答
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);

然后工作。

于 2013-10-17T20:51:46.953 回答