【问题标题】:How to make XmlSerializer ignore a property in an array to be serialized?如何使 XmlSerializer 忽略要序列化的数组中的属性?
【发布时间】:2013-10-17 15:33:14
【问题描述】:

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 是用属性声明的,或者它是一个复杂类型而其他属性是原始类型有关。

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我试过这个,但它仍然序列化 EntityKey 属性。
  • 我怀疑它类似于上面的帖子,因为您的代码传递了一个空的属性集合,因此没有一个被覆盖
  • 看这里的例子,它首先显示了添加一些属性:msdn.microsoft.com/en-us/library/6c5dw5z7.aspx
【解决方案2】:

首先,您需要将覆盖附加到 成员,而不仅仅是类型 - 有一个接受成员名称的 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-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2016-08-27
    相关资源
    最近更新 更多