2013-10-17 27 views
1

MSDN給出瞭如何使XmlSerializer類忽略一個類的屬性一個很好的例子,被序列化:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore.aspx如何讓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); 
} 

然而,當我跑我的代碼,我得到相同的結果之前,我添加的代碼忽略的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。我想知道這是否與Entity Framework設計類的方式有關。

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; } 

有稱爲第二屬性使用XmlIgnore聲明的EntityState,所以我沒有必須忽略它的問題。

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

編輯:我做了一個發現。如果我試圖忽略EntityObject上的實際數據屬性之一,它可以正常工作。我想知道它是否可能與EntityKey使用屬性聲明有關,或者它是複雜類型,而其他屬性是基本類型。

+0

還有一個類似的問題,關於忽略屬性的屬性,可能有關:http://stackoverflow.com/questions/17947998 –

回答

0

您實際上並未指定您想要覆蓋哪種屬性。使用類似

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

這是重要的,因爲否則它會認爲你要忽略的EntityKey數組本身上,但由於它沒有它也不會忽略它。

--updated顯示二線變化

+0

我試過這個,但它仍然序列化EntityKey屬性。 –

+0

我懷疑這是類似上面的帖子,因爲你的代碼傳入一個空的屬性集合,因爲沒有被覆蓋的地方 –

+0

看看這裏的例子,它首先顯示添加一些屬性:http://msdn.microsoft.com/en -us/library/6c5dw5z7.aspx –

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); 

然後工作。

相關問題