web-dev-qa-db-ja.com

WCFで[Serializable]ではなく[DataContract]を使用する利点は何ですか

DataContractを使用する利点はありますか?

27
user496949

Dan Rigsbyのブログで素晴らしい XmlSerializerとDataContractSerializerの比較 を参照してください。

DataContractSerializerを支持するいくつかのポイント:

  • xmlSerializerよりも約10%高速
  • [DataMember]で装飾されたものはすべてシリアル化されます-publicが表示されていなくても
  • ( "opt-in")に具体的に指示しない限り何もシリアル化しません
  • Order=[DataMember]属性を使用して、要素がシリアル化される順序を定義できます。
  • 逆シリアル化のためにパラメーターのないコンストラクターを必要としません
35
marc_s

ここで他の人がまだ答えていない質問が1つあります:[Serializable]を使用し、それでもDataContractSerializerを使用してそのタイプをシリアル化するとどうなりますか? [DataContract]タイプをDataContractSerializerでシリアル化するのと何か違いはありますか?

答え:それは絶対に違いはありません!その理由は、サポートされている型をDataContractSerializerに渡すと、最初のシリアル化または逆シリアル化のエピソードで、型のメンバーなどに関するすべての情報を含む内部構造に型が「細断」されるためです。キャッシュされた内部構造(動的ILを使用して保持)を後続のシリアル化エピソードに使用し、元のタイプに戻ることはありません。

また、DataContractSerializer[Serializable]タイプのシリアル化とXmlSerializerの同じタイプのシリアル化を比較すると、DataContractのシリアル化が指数関数的に高速であることがわかります。これの少しは、ここで利用可能なパフォーマンス比較ホワイトペーパーに表示されます: http://msdn.Microsoft.com/en-us/library/bb310550.aspx

11
krisragh MSFT

DataContractはXmlSerializerよりも消費者志向であることも覚えておいてください。

XmlSerializerには純粋な技術的側面(「このオブジェクトをXMLに変換する方法」)がありますが、DataContractはビジネスコンセプトの公開表現です。

そのため、DataContractは、クラスに加えたすべての変更がコンシューマーに影響を与え、このコントラクトに暗黙的に拘束されることを思い出させるものとして機能します。概念的には、DataContractはサービスアーキテクチャの中心的な要素であり、XmlSerializerは単なるヘルパーです。

3
Johann Blais

構文の違いとマイナーな機能を除いて、XMLにシリアル化およびXMLから逆シリアル化するだけの場合、比較の実際の基盤はありません。シリアライズ可能に対するDataContractの最も強力な利点(誰もがスキップしているように見えるもの)は、データコントラクトはXML固有ではありませんです。

データコントラクトを使用する場合、論理構造はデータコントラクトとデータメンバー(データコントラクトのメンバー)の2つだけです。データコントラクトには、「要素」や「xml要素」などはありません。

理論的には、データコントラクトベースのシリアル化により、オブジェクト構造を任意のデータ交換形式で表すことができますが、現時点では.NETFrameworkで使用できるのはXMLとJSONのシリアル化/逆シリアル化のみです。ただし、たとえばRDFで動作するシリアライザーを作成することは確かに可能であり、そこには追加のシリアライザーがあると思います。

以下の単純なアーキテクチャについて考えてみます。

C#

[DataContract]
class Company
{
    [DataMember]
    public string Name { get; set }

    [DataMember]
    public Person[] People { get; set }
}

[DataContract]
class Person
{
    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}

このコントラクトはXML固有ではありません。 XML関連のものは何も指定していません。上記のアーキテクチャのインスタンスをXMLにシリアル化できます。

[〜#〜] xml [〜#〜]

<Company>
  <Name>...</Name>
  <People>
    <Person>
      <FirstName>James</FirstName>
      <LastName>Sunderland</LastName>
    </Person>
    ...
  </People>
</Company>

...またはJSONに:

[〜#〜] json [〜#〜]

{
    "Company": {
        "Name": "...",
        "People": [
            {
                "FirstName": "James",
                "LastName": "Sunderland"
            },
            ...
        ]
    }
}

...または、その形式のシリアライザーを所有している限り、任意のデータ交換形式に変換します。

これは非常に強力で柔軟性があります。特に、複数のタイプのクライアントやピアによって消費されるWebサービスがある場合、またはWebサービスのコンシューマーグループが将来拡張される可能性がある場合は、次のようになります。

  • JSONは、JavaScriptおよびPHPサーバー(または任意の動的言語))でのシリアル化/逆シリアル化が簡単です。
  • XMLは、WCFクライアントでシリアル化/逆シリアル化するのがより簡単です。

アプリケーションアーキテクチャで唯一のデータ交換形式としてXMLに制約されたくない場合は、DataContractを使用することをお勧めします。それ以外の場合、SerializableはXMLに対してのみ少し便利です。

3
John Weisz

.NETタイプをXMLにシリアル化するためのXmlSerializerの重要な問題

  • XMLに変換できるのは、パブリックフィールドまたは.NETタイプのプロパティのみです。
  • IEnumerableインターフェイスを実装するクラスのみ
  • ハッシュテーブルなどのIDictionaryインターフェイスを実装するクラスはシリアル化できませんDataContractSerializerとXMLSerializerの重要な違い

DataContractSerializerの設計の実際的な利点は、Xmlserializerよりも優れたパフォーマンスです。

  • XMLシリアル化は、タイプのどのフィールドまたはプロパティがXMLにシリアル化されるかを示しませんが、DataCotractSerializerは
  • どのフィールドまたはプロパティがXMLにシリアル化されているかを明示的に示します
  • DataContractSerializerはHashTableをXMLに変換できます
2
Pranay Rana

この質問はかなり古いですが、私は私の理解を要約します:

1)Datacontractは、(DataMember)属性を使用して特定のメンバーまたはフィールドをシリアル化する柔軟性を提供します。 2)DataContractを使用して、オブジェクトをシリアル化する順序を決定できます。

DataContractがパブリックメンバーをシリアル化するのに対し、Serializableはデフォルトで存在するフィールドをシリアル化するため、明らかなことは別として。

1
Apoorva