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; }
}
正常に動作していますが、DataContract
とDataMember
を削除すると、正常に動作します。なぜ適切に機能しているのか理解できません。 DataContract
の実際の使用方法を教えてください。
私のサービス契約はこんな感じ
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
Contact XmlData(string id);
}
.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]
属性をそのままにしておくことはできますが、データクラスにこれらを含めることをお勧めします。あなたがそれらなしでは得られないすべての追加機能へのアクセスを自分に与える...
WCFに関しては、メッセージを介してサーバーおよびクライアントと通信できます。メッセージを転送するため、およびセキュリティの観点から、シリアル化された形式でデータ/メッセージを作成する必要があります。
データのシリアル化には[datacontract]および[datamember]属性を使用します。使用している場合datacontract
WCFはDataContractSerializer
を使用し、そうでない場合はWCFはXmlSerializer
を使用しますデフォルトのシリアル化手法。
詳細に説明させてください。
基本的に、WCFは3種類のシリアル化をサポートしています。
XmlSerializer:-デフォルトの順序はクラスと同じ
DataContractSerializer/NetDataContractSerializer:-デフォルトの順序はアルファベット順です
XmlSerializer:-XMLスキーマは広範です
DataContractSerializer/NetDataContractSerializer:-XMLスキーマは制約されています
XmlSerializer:-バージョン管理のサポートは不可
DataContractSerializer/NetDataContractSerializer:-バージョン管理サポートが可能です
XmlSerializer:-ASMXとの互換性
DataContractSerializer/NetDataContractSerializer:-.NET Remotingとの互換性
XmlSerializer:-XmlSerializerでは属性は不要
DataContractSerializer/NetDataContractSerializer:-このシリアライズに必要な属性
使用するものは要件によって異なります...
データコントラクトは、交換されるデータを抽象的に記述するサービスとクライアント間の正式な合意です。つまり、通信するために、クライアントとサービスは同じタイプを共有する必要はなく、同じデータコントラクトのみを共有します。データコントラクトは、パラメーターまたは戻り値の型ごとに、どのデータをシリアル化(XMLに変換)して交換するかを正確に定義します。
Windows Communication Foundation(WCF)は、既定でデータコントラクトシリアライザーと呼ばれるシリアル化エンジンを使用して、データをシリアル化および逆シリアル化します(XMLとの変換)。整数や文字列などのすべての.NET Frameworkプリミティブ型、およびDateTimeやXmlElementなどのプリミティブとして扱われる特定の型は、他の準備なしでシリアル化でき、既定のデータコントラクトを持つと見なされます。多くの.NET Frameworkタイプには、既存のデータコントラクトもあります。
完全な記事を見つけることができます こちら
データコントラクトは、交換されるデータを抽象的に記述するサービスとクライアント間の正式な合意です。
データコントラクトは明示的または暗黙的です。 int、stringなどの単純型には、暗黙的なデータコントラクトがあります。ユーザー定義オブジェクトは明示的または複合タイプであり、[DataContract]および[DataMember]属性を使用してデータコントラクトを定義する必要があります。
データコントラクトは次のように定義できます。
サービス操作との間でやり取りされるデータの外部形式について説明します
サービスメッセージで交換されるデータの構造とタイプを定義します
System.Runtime.Serialization参照をプロジェクトに含める必要があります。このアセンブリは、DataContractおよびDataMember属性を保持します。
データコントラクト:エンティティクラスがシリアル化プロセスの準備ができていることを指定します。
データメンバー:特定のフィールドがデータコントラクトの一部であり、シリアル化できることを指定します。
DataMember属性は、データをシリアル化するために追加する必要はありません。 DataMember属性が追加されない場合、古いXMLSerializerはデータをシリアル化します。 DataMemberを追加すると、order、name、isrequiredなどの便利なプロパティが提供されます。これは他の方法では使用できません。
また、httpリクエストから呼び出す場合は正常に動作しますが、net.tcpから呼び出しようとすると、この種のものがすべて取得されます