いつDataContract属性とDataMember属性を使用するのですか?


179

DataContractWCF の属性について非常に混乱しています。私の知識によれば、クラスのようなユーザー定義型をシリアライズするために使用されます。このようにクライアント側で公開されるクラスを1つ書きました。

[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

サービス契約はこんな感じ

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

完璧な答えはこちら 。stackoverflow.com
questions / 5681842 /

回答:


361

.NET 3.5 SP1では、多くのプログラマーが[DataContract][DataMember]属性に圧倒されていたため、Microsoftはデータコントラクトシリアライザーに、これらの属性がなくても、古いXMLシリアライザーのようにすべてのクラスを処理させました。

したがって、.NET 3.5 SP1以降では、データコントラクトまたはデータメンバーの属性追加する必要はありません。追加しない場合、データコントラクトシリアライザーは、XMLシリアライザーと同様に、クラスのすべてのパブリックプロパティをシリアル化します。

ただし、これらの属性を追加しないと、多くの有用な機能が失われます。

  • がなけれ[DataContract]ば、データを格納するXML名前空間を定義できません。
  • なしでは[DataMember]、非パブリックプロパティまたはフィールドをシリアル化できません
  • なしでは[DataMember]、シリアル化の順序(Order=)を定義できず、DCSはすべてのプロパティをアルファベット順にシリアル化します
  • なし[DataMember]では、プロパティに別の名前を定義できません(Name=
  • なしでは[DataMember]IsRequired=などの有用な属性を定義できません
  • なしでは[DataMember]、特定のパブリックプロパティを省略できません-すべてのパブリックプロパティはDCSによってシリアル化されます

したがって、「迅速かつ汚い」ソリューションでは、[DataContract]および[DataMember]属性を削除しても機能しますが、データクラスにそれらを含めることは、あなたがやっていることをより明確にし、自分自身に与えるために、それでも良い考えです。それらなしでは得られないこれらすべての追加機能へのアクセス...


つまり、デフォルトではすべてのデータ型が内部的にシリアル化可能としてマークされており、DataContract / DataMemberを使用してそれらを制限しています。
santosh sing

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

36
@Arthis:それは完全に真実ではありません。.NET 3.5 SP1のように、WCFは意志喜んなしのシリアル化クラスの任意 [DataContract]および[DataMember]属性...しかし、あなたはこれらの属性のいずれかを使用し始めるとすぐに、この「デフォルト」の動作は動作を停止します-とすぐに持っているように、単一の [DataMember]あなたにクラス、その時点から、この属性を持つプロパティのみがシリアル化されます。
marc_s

4
おお!その点を明確にするためのTHX!それでは、もう少し掘り下げます。
Arthis

6
ヨウホウ!揺れる!メルシーボークー!
Arthis

16

WCFに関しては、メッセージを介してサーバーおよびクライアントと通信できます。メッセージを転送するため、およびセキュリティの観点から、シリアル化された形式でデータ/メッセージを作成する必要があります。

データのシリアル化には、[datacontract]属性と[datamember]属性を使用します。 あなたの場合、datacontractWCFを使用している場合はDataContractSerializerelse、WCFはXmlSerializerデフォルトのシリアル化手法であるWCFを使用しています。

詳しく説明します。

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

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

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

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

XmlSerializer-XMLスキーマは広範囲

DataContractSerializer / NetDataContractSerializer-XMLスキーマは制約されています

XmlSerializer:-バージョン管理のサポートはできません

DataContractSerializer / NetDataContractSerializer:-バージョン管理のサポートが可能

XmlSerializer:-ASMXとの互換性

DataContractSerializer / NetDataContractSerializer:-.NET Remotingとの互換性

XmlSerializer-XmlSerializerでは属性は不要

DataContractSerializer / NetDataContractSerializer:-このシリアライズで必要な属性

使用するものは要件によって異なります...


8

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

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

あなたはここで完全な記事を見つけることができます


2
すべての真実と罰金だが、それは実際にデータコントラクトシリアライザでも、あなたのクラスのいずれかの[のDataContract]および[DataMemberを]属性....せずに動作します理由としてOPの質問に答えていないこと
marc_s

DataContractの実際の使用方法を教えてもらえますか?-質問の少なくとも一部回答されていると思います。
IAbstract

2

データコントラクトは、サービスとクライアントの間の正式な合意であり、交換するデータを抽象的に記述します。

データコントラクトは明示的または暗黙的です。int、stringなどの単純型には、暗黙的なデータコントラクトがあります。ユーザー定義オブジェクトは明示的または複雑なタイプであり、[DataContract]および[DataMember]属性を使用してデータコントラクトを定義する必要があります。

データコントラクトは次のように定義できます。

  • サービス操作との間でやり取りされるデータの外部形式について説明します

  • サービスメッセージで交換されるデータの構造とタイプを定義します

  • CLR型をXMLスキーマにマップします
  • データ型をシリアル化および逆シリアル化する方法を定義します。シリアライゼーションを通じて、オブジェクトをネットワーク経由で送信できる一連のバイトに変換します。逆シリアル化により、呼び出し元のアプリケーションから受け取った一連のバイトからオブジェクトを再構成します。
  • 構造化データへの変更を管理できるバージョン管理システムです

プロジェクトへのSystem.Runtime.Serialization参照を含める必要があります。このアセンブリは、DataContractおよびDataMember属性を保持します。


2
  1. データコントラクト:エンティティクラスがシリアル化プロセスの準備ができていることを指定します。

  2. データメンバー:特定のフィールドがデータコントラクトの一部であり、シリアル化できることを指定します。


0

また、httpリクエストから呼び出すと正常に動作しますが、net.tcpから呼び出そうとすると、このようなものをすべて取得します


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.