web-dev-qa-db-ja.com

DataContractおよびDataMember属性を使用する場合

WCFのDataContract属性について非常に混乱しています。私の知る限りでは、クラスのようなユーザー定義型をシリアル化するために使用されます。このようにクライアント側で公開されるクラスを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);      
}
166
sam

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

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

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

  • [DataContract]がないと、データが存在するXML名前空間を定義できません
  • [DataMember]がないと、非パブリックプロパティまたはフィールドをシリアル化できません
  • [DataMember]がない場合、シリアル化の順序(Order=)を定義できず、DCSはすべてのプロパティをアルファベット順にシリアル化します
  • [DataMember]がないと、プロパティに別の名前を定義できません(Name=
  • [DataMember]がないと、IsRequired=などの便利な属性を定義できません
  • [DataMember]がないと、特定のパブリックプロパティを除外できません-すべてのパブリックプロパティはDCSによってシリアル化されます

したがって、「クイック&ダーティ」ソリューションの場合は、[DataContract]属性と[DataMember]属性をそのままにしておくことはできますが、データクラスにこれらを含めることをお勧めします。あなたがそれらなしでは得られないすべての追加機能へのアクセスを自分に与える...

333
marc_s

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 Remotingとの互換性

XmlSerializer:-XmlSerializerでは属性は不要

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

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

13
Pradeep atkari

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

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

完全な記事を見つけることができます こちら

8
mr.b

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

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

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

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

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

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

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

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

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

2
Mrunalini

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

0
Vijay Mishra

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

0
Pramod