2011-01-29 15 views
141

WCFのDataContract属性について非常に混乱しています。私の知る限りでは、クラスのようなユーザ定義型を直列化するために使用されます。私はこのようにクライアント側で公開されている1つのクラスを書きました。DataContract属性とDataMember属性はいつ使用しますか?

[DataContract] 
public class Contact 
{ 
    [DataMember] 
    public int Roll { get; set; } 

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

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

    [DataMember] 
    public int Age { get; set; } 
} 

それは正常に動作しているが、私はDataContractDataMemberを削除するとき、それはまた、正常に動作します。なぜそれが適切に働いているのか理解できません。いずれかがDataContractの実際の使用は何ですか?

マイサービス契約は、.NET 3.5 SP1で、Microsoftはデータコントラクトシリアライザは、すべてのクラスを扱う作られた、プログラマーの多くは[DataContract][DataMember]属性に圧倒されたので、この

[ServiceContract]  
public interface IRestServiceImpl 
{ 
    [OperationContract]   
    Contact XmlData(string id);  
} 
+0

ここでは完璧な答えはhttp://stackoverflow.com/questions/5681842/datacontracts-and-datamembers –

答えて

288

のように見える - でも、どのなし古いXMLシリアライザとよく似ています。

.NET 3.5 SP1の場合、にはが必要です。データコントラクトシリアライザは、データコントラクトまたはデータメンバアトリビュートをもう追加しないと、クラスのすべてのパブリックプロパティをシリアル化しますXMLシリアライザが実現します。

もつとも:それらの属性を追加しないことで、あなたは便利な機能の多くを失う:[DataContract]なし

  • を、あなたは、[DataMember]なし
  • に住むためにあなたのデータのためのXML名前空間を定義することはできません非公開のプロパティまたはフィールドをシリアル化できません
  • [DataMember]なしでシリアル化の順序を定義することはできません(Order=)、DCSはすべてのプロパティをアルファベット順にシリアル化します
  • [DataMember]せずに、あなたは(Name=
  • [DataMember]せずにあなたの財産に別の名前を定義することはできません、あなたは[DataMember]なしIsRequired=または他の有用な属性
  • のようなものを定義することはできません、あなたは、特定のパブリックプロパティを除外することはできません - すべての公開をプロパティが動作します[DataContract][DataMember]属性を離れて残して、だから、「quick'n'dirty」ソリューションをDCS

によってシリアライズされます - それはあなたのダ上でそれらを持っていることはまだ良いアイデアですTAクラス - ちょうどあなたがやっていることについて、より明確にするために、そして自分自身にあなたがそれらなし得ることはありませんすべてのそれらの追加機能へのアクセスを提供するために...

+0

です。デフォルトでは、すべてのデータ型は内部的にシリアライズ可能とマークされており、DataContract/DataMemberを使用してデータ型を制限しています。 –

+2

@サントシ:いくつかのパブリックプロパティを持つクラスがある場合、明示的に[DataContract]/[DataMember]を適用しない限り、それらはWCFデータコントラクションシリアライザによってシリアル化されます.-次にシリアル化されるものを100%何がありません –

+0

説明をありがとう。 –

6

データコントラクトは、サービス間の正式な契約です交換されるデータを抽象的に記述するクライアントとを含む。つまり、通信するために、クライアントとサービスは同じタイプを共有する必要はなく、同じデータ契約のみを共有する必要があります。データコントラクトは、各パラメータまたは戻り値の型に対して、どのデータをシリアル化(XMLに変換)して交換するかを正確に定義します。

Windows通信基盤(WCF)シリアライゼーション・エンジンは、(XMLにしてから、それを変換する)データをシリアライズとデシリアライズするために、デフォルトでは、データ契約シリアライザと呼ばれる使用しています。すべて 。整数や文字列などの.NET Frameworkプリミティブ型、およびDateTimeやXmlElementなどのプリミティブとして扱われる特定の型は、他の準備なしでシリアル化でき、既定のデータコントラクトがあるとみなされます。多くの.NET Frameworkタイプには、既存のデータコントラクトもあります。

あなたがHTTPから呼び出すときは、また記事全文here.

+1

それは本当にうまくありますが、データ契約シリアライザがクラスで[DataContract]属性と[DataMember]属性なしで動作する理由についてOPの質問に実際には答えていません。 .. –

+0

* DataContractの実際の使用状況を教えてもらえますか?* - 私は質問の少なくとも一部が**答えられていると思います。 – IAbstract

0

を見つけることができますが、それが正常に動作しますが、あなたの試みは、あなたが言えば、すべてのこの種のもの

10

を取得し、その時点net.tcpからコールする際に要求しますWCFの場合、メッセージを通じてサーバーとクライアントと通信できます。メッセージを転送するため、およびセキュリティの見込みから、シリアル化された形式でデータ/メッセージを作成する必要があります。

データをシリアル化するには、[datacontract]属性と[datamember]属性を使用します。 ご使用の場合、datacontract WCFはDataContractSerializerを使用し、それ以外の場合はWCFはデフォルトのシリアル化手法であるXmlSerializerを使用します。

私は詳細に説明しましょう:

基本的にWCFシリアル化の3種類をサポートします。

  1. をXmlSerializerを
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializerを: - デフォルトの順序クラスと同じです

DataContractSerializer/NetDataContractSerializer: - デフォルトの順序はアルファベット順

XmlSerializerをです: - XMLスキーマが広範である

DataContractSerializer/NetDataContractSerializer: - XMLスキーマが制約されている

XmlSerializer: - バージョン対応はできません

DataContractSerializer/NetDataContractSerializer: - サポートをバージョン管理する

のXmlSerializer可能です: - ASMX

DataContractSerializer/NetDataContractSerializerとの互換性: - .NETリモート処理との互換性

XmlSerializerを :XmlSerializerで属性が必要ない

DataContractSerializer/NetDataContractSerializer: - このシリアライズ

に必要な属性はそう何を使用すると、あなたの要件に依存します...

0

DataMember属性は、データのシリアル化に追加するために必須ではありません。 DataMember属性が追加されていない場合、古いXMLSerializerはデータをシリアル化します。 DataMemberを追加すると、order、name、isrequiredなどの有用なプロパティが提供されます。これは他には使用できません。

0

データ契約とは、交換されるデータを抽象的に記述するサービスとクライアントの正式な合意です。

データコントラクトは、明示的または暗黙的に指定できます。 int、stringなどのシンプルな型は、暗黙のデータコントラクトを持っています。ユーザー定義オブジェクトは、[DataContract]および[DataMember]属性を使用してDataコントラクトを定義する必要がある、明示的または複合タイプです。次のように

データコントラクトを定義することができる。

  • それは、サービスメッセージで交換されるデータの構造およびタイプを定義するサービス操作にから

  • を渡されたデータの外部形式を記述する

  • CLR型をXMLスキーマにマップします。
  • データ型のシリアル化およびデシリアライズ方法を定義します。シリアライゼーションにより、オブジェクトをネットワーク経由で送信できる一連のバイトに変換します。デシリアライゼーションでは、呼び出し元のアプリケーションから受け取った一連のバイトからオブジェクトを再構成します。
  • それはあなたが私たちのプロジェクトにSystem.Runtime.Serialization参照を含める必要が構造化データ

への変更を管理することを可能にするバージョン管理システムです。このアセンブリは、DataContractおよびDataMember属性を保持します。

関連する問題