[英]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.