3

Iを使用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ですか?

4

2 に答える 2

1

異なる名前空間でサブデータコントラクトを定義し、それらを別のデータコントラクトのメンバーとして使用することはできますが、個々のメンバーの名前や形状を制御することはできません。これは、XMLの「形状」をきめ細かく制御DataContractSerializerするために置き換えることを目的としたものではありません。XmlSerializer

于 2009-11-10T05:12:49.597 に答える
0

nitzmahoneによるこの回答で述べられているように、特定のデータコントラクトタイプが複数の名前空間でメンバーを宣言することはできませんが、タイプ階層では、派生タイプが元のタイプとは異なるデータコントラクト名前空間に属する可能性があります。それらは継承します。これが発生すると、各メンバーは、宣言されている名前空間にシリアル化されます。適切な型階層を構築することにより、異なる名前空間にメンバーを持つXMLエンティティを。によって(逆)シリアル化できます。DataContractSerializer

具体的なルールは次のとおりです。

  1. データコントラクトタイプが継承階層の一部である場合、その基本タイプのデータメンバーは常に最初の順序になります。1

  2. データメンバーは、宣言されているデータメンバータイプのデータコントラクト名前空間にシリアル化されます。

  3. データコントラクトタイプのルート名前空間は、最も派生したタイプの名前空間です。

  4. XML要素は、データメンバーの順序で指定された順序で(逆)シリアル化されます。 DataContractSerializerデシリアライズ中にデータメンバーを自由に並べ替えることはできません。2

  5. コレクションには、データコントラクトのコレクションタイプで指定されている独自のルールがあります。この答えは彼らには当てはまりません。

したがって、質問の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要素のシーケンスは、上記のルールを適用して適切な型階層を構築することで取得でき、さまざまな名前空間の要素を逆シリアル化する要件を満たす回避策を提供します。

もちろん、このような階層は他の理由で不便な場合があります。その場合、データコントラクトサロゲートメカニズムを使用して、優先データモデルタイプをDT​​Oに置き換えることができます。


1 データメンバーの注文

2 データメンバーの順序とXMLの逆シリアル化

于 2018-12-14T03:24:54.823 に答える