wcf - 空間 - シリアル 化 できません この 型 を datacontractattribute 属性 で マーク する か




DataContract属性とDataMember属性はいつ使用しますか? (5)

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

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

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


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


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


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

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

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

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

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

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

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


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





datamember