DataMember を DataContract の別の名前空間に追加する
-
19-09-2019 - |
質問
とともに XmlSerializer
親タイプとは異なる名前空間にメンバーを置くことができます。
同じことをしてもいいですか DataContractSerializer
?
次の XML が必要です。
<h:Type xmlns:h="http://schemas.e.com/WebServices"
xmlns="http://schemas.e.com/WebServices">
<Member xmlns="http://schemas.e.com/CoreTypes">0</Member>
</h:Type>
これは可能ですか? DataContractSerializer
?
解決
あなたは、異なる名前空間にsubdatacontractsを定義し、別のDataContractのメンバーとしてそれらを使用しますが、個々のメンバー名および/または形状を制御することはできません。 DataContractSerializer
はあなたのXMLの「形状」のきめ細かな制御のためのXmlSerializer
に代わるものではありません。
他のヒント
で述べられているようにそれは真実ですが、 この答え による ニッツマホーン 特定のデータ コントラクト型は複数の名前空間で宣言されたメンバーを持つことができないため、型内で宣言されたメンバーを持つことができない可能性があります。 階層, 、派生型は、継承元の基本型とは異なるデータ コントラクト名前空間に属することができます。これが発生すると、各メンバーは、それが存在する名前空間にシリアル化されます。 宣言された. 。適切な型階層を構築することで、異なる名前空間のメンバーを持つ 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 データメンバーの順序.