nitzmahoneによるこの回答で述べられているように、特定のデータコントラクトタイプが複数の名前空間でメンバーを宣言することはできませんが、タイプ階層では、派生タイプが元のタイプとは異なるデータコントラクト名前空間に属する可能性があります。それらは継承します。これが発生すると、各メンバーは、宣言されている名前空間にシリアル化されます。適切な型階層を構築することにより、異なる名前空間にメンバーを持つXMLエンティティを。によって(逆)シリアル化できます。DataContractSerializer
具体的なルールは次のとおりです。
データコントラクトタイプが継承階層の一部である場合、その基本タイプのデータメンバーは常に最初の順序になります。1
データメンバーは、宣言されているデータメンバータイプのデータコントラクト名前空間にシリアル化されます。
データコントラクトタイプのルート名前空間は、最も派生したタイプの名前空間です。
XML要素は、データメンバーの順序で指定された順序で(逆)シリアル化されます。 DataContractSerializer
デシリアライズ中にデータメンバーを自由に並べ替えることはできません。2
コレクションには、データコントラクトのコレクションタイプで指定されている独自のルールがあります。この答えは彼らには当てはまりません。
したがって、質問のXMLはDerivedType
、次のタイプ階層で使用できます。
[DataContract(Name = "Base", Namespace = "http://schemas.e.com/CoreTypes")]
public class BaseType
{
[DataMember]
public int Member { get; set; }
}
[DataContract(Name = "Type", Namespace = "http://schemas.e.com/WebServices")]
public class DerivedType : BaseType
{
}
また、一般に、名前空間の任意のシーケンスのXML要素のシーケンスは、上記のルールを適用して適切な型階層を構築することで取得でき、さまざまな名前空間の要素を逆シリアル化する要件を満たす回避策を提供します。
もちろん、このような階層は他の理由で不便な場合があります。その場合、データコントラクトサロゲートメカニズムを使用して、優先データモデルタイプをDTOに置き換えることができます。
1 データメンバーの注文。
2 データメンバーの順序とXMLの逆シリアル化