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 は無視されません。これは、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 という 2 番目のプロパティがあるため、無視しなければならないという問題はありませんでした。

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

編集:私は発見をしました。EntityObject の実際のデータ プロパティの 1 つを無視しようとすると、問題なく動作します。EntityKey が属性で宣言されていること、または他のプロパティがプリミティブ型であるのに対し、それが複合型であることのいずれかと関係があるのではないかと思います。

4

2 に答える 2

0

まず、タイプだけでなく、メンバーにオーバーライドをアタッチする必要があります-Addメンバー名を受け入れるオーバーロードがあります。

2 つ目は、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 に答える