192

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);      
}
4

8 に答える 8

381

.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]属性を省略しても機能しますが、データクラスにそれらを含めることをお勧めします。これは、実行していることをより明確にし、自分自身に与えるためです。それらなしでは得られないすべての追加機能へのアクセス...

于 2011-01-29T12:18:01.460 に答える
18

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

データをシリアル化するには、[datacontract] および [datamember] 属性を使用します。 あなたの場合、datacontractWCF を使用している場合は、WCF がデフォルトのシリアル化手法であるDataContractSerializer他の方法を使用します。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 :- このシリアル化に必要な属性

したがって、何を使用するかは要件によって異なります...

于 2014-11-10T08:07:27.030 に答える
8

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

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

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

于 2011-01-29T12:20:05.273 に答える
2

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

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

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

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

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

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

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

于 2017-01-10T06:42:48.750 に答える
0

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

于 2013-03-07T05:01:04.387 に答える