wcf 空間 - DataContract属性とDataMember属性はいつ使用しますか?




意味 構造 (7)

私は非常に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);      
}

Answers

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


  1. データコントラクト:エンティティクラスがシリアライズ処理の準備ができていることを指定します。

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


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

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

here.詳しい記事を見つけることができますhere.


多くのプログラマは.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]属性を省略しても問題ありませんが、データクラスに追加することをお勧めします。あなたがそれらなしで得ることができないそれらのすべての追加機能へのあなた自身のアクセスを与えるために...


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

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

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

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

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

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

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


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


この問題が発生したときに、プロジェクトにコレクションを最近追加した場合、同じCollectionDataContract属性を持つ2つのコレクションによって問題が発生する可能性があります。

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="AItems", ItemName="A")]  // Wrong
public class CollectionB : List<B> { }

私は自分のプロジェクトを一掃し、すべてのName属性とItemName属性が一意であることを確認してエラーを解決しました:

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="BItems", ItemName="B")]  // Corrected
public class CollectionB : List<B> { }

その後、私はサービス参照をリフレッシュし、すべてが再び機能しました。







wcf datacontractserializer datacontract datamember