2012-02-18 12 views
1

AJAX呼び出しを使用してWCF RESTサービスを使用したいとします。ユーザー定義クラスをDataContractとして定義するかどうかを指定します。

Personは、ユーザー定義クラスです私は、次のしていると仮定します。

[ServiceContract] 
public interface IPerson 
{ 
    [WebInvoke(ResponseFormat = WebMessageFormat.Json)] 
    [OperationContract] 
    Person GetPerson(); 
} 

DataContractとしてPersonを定義する間、私はDataContractとしてPersonを定義しない場合の違いは何ですか?クライアント側では

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string FirstName { get; set; } 

    [DataMember] 
    public string LastName { get; set; } 
} 

私は常に正しい、PersonDataContractかのように定義されているかどうかに関係なく、次を使用できますか?

<script type="text/javascript"> 
    $().ready(function() { 
     $("#Button1").click(function() { 
      $.getJSON("<url of the service>/GetPerson", CallBackMethod); 
     }); 
    }); 

    function CallBackMethod(result) { 
     alert(result.FirstName); 
     alert(result.LastName); 
    } 
</script> 

答えて

2

データコントラクトは、.NET Frameworkがサポートするシリアル化の1つの形式です。本質的にWCF以前のXMLシリアル化の代替品です。これはすべて、データコントラクトに一致するシリアル化されたXMLにオブジェクトを変換するDataContractSerializerによって行われます。これは、WCFとASP.NET JSONコードで使用されるシリアライザクラスです。

理論上、契約オブジェクトにDataContract属性とDataMember属性を付けて、その内容を明確にする必要があります。実際には、DataContractSerializerはデータコントラクトを任意のカスタムタイプから作成します。それらをオフにすると、DataContract属性とDataMember属性が推測されます。それらを追加すると、XMLのシリアル化属性を追加するのとまったく同じ方法で、シリアル化の動作をより詳細に制御できます。明示的な属性がないと、オブジェクトのすべてのパブリックフィールドがデータコントラクトの一部になります。

あなたの質問に対する本当の答えは、少なくとも、シリアライザに関する限り、Personは常にがDataContractとして定義されていることです。あなたのクラスとすべてのパブリックメンバーに属性を追加すると同じ効果が得られます。 IMOには、ではなく、という理由がありません。入力に数ミリ秒かかることがあります。実行しないと、とにかく実行してしまったようです。

1

まず、タイプによっては複数のプログラミングモデルが実装されることがあります。たとえば、DataContractとIXmlSerializableの両方でも、CollectionDataContractとIXmlSerializableの両方でも可能です。 DataContractAttributeだけではない、データコントラクトプログラミングモデルは、そのような型のシリアル化方法を決定します。この仕組みの詳細については、the awesome blog post hereを参照してください。

具体的な質問に答えるには、.NET 3.5 SP1まで、DataContractAttributeで装飾されていない限り、「POCO」タイプ(普通の古いC#タイプ)をシリアル化できませんでした。しかし、POCOサポートが導入されても、それは何の違いもありませんでした。詳細は、this blog postを参照してください。

希望すると便利です。

関連する問題