簡體   English   中英

如何使XmlSerializer忽略要序列化的數組中的屬性?

[英]How to make XmlSerializer ignore a property in an array to be serialized?

MSDN提供了一個很好的示例,說明如何使XmlSerializer類忽略要序列化的類中的屬性: http : //msdn.microsoft.com/zh-cn/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或它是一個復雜類型而其他屬性是原始類型有關。

您實際上並沒有指定要覆蓋的屬性類型。 使用類似

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

這很重要,因為否則它會認為您想忽略數組本身上的EntityKey,但是由於它沒有,因此不會忽略它。

-更新以顯示第二行更改

首先,您需要將替代項附加到member上 ,而不僅是類型- 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);

然后工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM