2012-02-18 2 views
1

Я хочу использовать службу REST WCF с помощью вызова AJAX.Определить пользовательский класс как DataContract или нет

Предположим, у меня есть следующие где Person является определенный пользователем класс:

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

Каковы различия между заданием Person как DataContract, и если я не определяю Person как DataContract?

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

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

На стороне клиента я всегда можете использовать следующий независимо от того, Person определяется как DataContract или нет, не так ли?

<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; они, по сути, являются заменой для предварительной сериализации XML WCF. Все это делается через DataContractSerializer, который отвечает за превращение вашего объекта в сериализованный XML, который соответствует контракту данных. Это класс сериализатора, который используется WCF и кодом ASP.NET JSON, среди других сторон.

В теории вы должны пометить свои объекты контракта атрибутами DataContract и DataMember, чтобы четко указать, для чего они предназначены. На практике DataContractSerializer сделает контракт с данными из любого настраиваемого типа, который вы ему даете; он выведет атрибуты DataContract и DataMember для вас, если вы их не отключите. Добавление их дает вам больше контроля над тем, как работает сериализация, точно так же, как и добавление атрибутов сериализации XML. Не имея явных атрибутов, все публичные поля в вашем объекте становятся частью контракта с данными.

Итак, реальный ответ на ваш вопрос заключается в том, что Person всегда определяется как DataContract, по крайней мере, до сериализатора; добавление атрибутов в ваш класс, и все его публичные члены будут давать тот же эффект. IMO, нет веской причины , а не: для этого вам потребуется несколько миллисекунд ввода, и если вы не будете работать, то просто притворитесь, что все равно.

1

Прежде всего, в некоторых случаях тип может реализовывать более одной модели программирования. Например, это могут быть как DataContract, так и IXmlSerializable, или это может быть как CollectionDataContract, так и IXmlSerializable. Модель программирования Data Contract - которая выходит за рамки только DataContractAttribute - диктует, как такие типы должны быть сериализованы. Подробнее о том, как это работает, см. В разделе the awesome blog post here.

Чтобы ответить на ваш конкретный вопрос, до .NET 3.5 SP1, вы не сможете сериализовать типы «POCO» (простые старые типы C#), если они не были украшены DataContractAttribute. Однако после того, как была введена поддержка POCO, это не имело никакого значения. См. this blog post.

Надеюсь, это поможет!

Смежные вопросы