DataContractを使用する利点はありますか?
Dan Rigsbyのブログで素晴らしい XmlSerializerとDataContractSerializerの比較 を参照してください。
DataContractSerializerを支持するいくつかのポイント:
[DataMember]
で装飾されたものはすべてシリアル化されます-public
が表示されていなくてもOrder=
の[DataMember]
属性を使用して、要素がシリアル化される順序を定義できます。ここで他の人がまだ答えていない質問が1つあります:[Serializable]
を使用し、それでもDataContractSerializer
を使用してそのタイプをシリアル化するとどうなりますか? [DataContract]
タイプをDataContractSerializer
でシリアル化するのと何か違いはありますか?
答え:それは絶対に違いはありません!その理由は、サポートされている型をDataContractSerializer
に渡すと、最初のシリアル化または逆シリアル化のエピソードで、型のメンバーなどに関するすべての情報を含む内部構造に型が「細断」されるためです。キャッシュされた内部構造(動的ILを使用して保持)を後続のシリアル化エピソードに使用し、元のタイプに戻ることはありません。
また、DataContractSerializer
の[Serializable]
タイプのシリアル化とXmlSerializer
の同じタイプのシリアル化を比較すると、DataContract
のシリアル化が指数関数的に高速であることがわかります。これの少しは、ここで利用可能なパフォーマンス比較ホワイトペーパーに表示されます: http://msdn.Microsoft.com/en-us/library/bb310550.aspx
DataContractはXmlSerializerよりも消費者志向であることも覚えておいてください。
XmlSerializerには純粋な技術的側面(「このオブジェクトをXMLに変換する方法」)がありますが、DataContractはビジネスコンセプトの公開表現です。
そのため、DataContractは、クラスに加えたすべての変更がコンシューマーに影響を与え、このコントラクトに暗黙的に拘束されることを思い出させるものとして機能します。概念的には、DataContractはサービスアーキテクチャの中心的な要素であり、XmlSerializerは単なるヘルパーです。
構文の違いとマイナーな機能を除いて、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サービスのコンシューマーグループが将来拡張される可能性がある場合は、次のようになります。
アプリケーションアーキテクチャで唯一のデータ交換形式としてXMLに制約されたくない場合は、DataContractを使用することをお勧めします。それ以外の場合、SerializableはXMLに対してのみ少し便利です。
.NETタイプをXMLにシリアル化するためのXmlSerializerの重要な問題
DataContractSerializerの設計の実際的な利点は、Xmlserializerよりも優れたパフォーマンスです。
この質問はかなり古いですが、私は私の理解を要約します:
1)Datacontractは、(DataMember)属性を使用して特定のメンバーまたはフィールドをシリアル化する柔軟性を提供します。 2)DataContractを使用して、オブジェクトをシリアル化する順序を決定できます。
DataContractがパブリックメンバーをシリアル化するのに対し、Serializableはデフォルトで存在するフィールドをシリアル化するため、明らかなことは別として。