WCF DataContract против класса сериализации - PullRequest
7 голосов
/ 18 января 2011

Я понимаю, что мы можем иметь больше элементов управления в классе, если мы используем datacontract, однако рассмотрим следующие 2 случая

[DataContract]
public class Customer
{
    [DataMember]
    public string CustomerName {get; set;}

    [DataMember]
    public int Age{get; set;}
}

и

public class Customer
{
    public string CustomerName {get; set;}
    public int Age{get; set;}
}

Они оба корректно сериализуются на клиенте .net. И лично я не использую второй пример. Кто-нибудь может указать мне различия в 2 классах? Я хотел отправить все открытые свойства в обоих классах.

Ответы [ 2 ]

5 голосов
/ 18 января 2011

Вторая версия - это версия вашего контракта данных POCO (обычный старый объект CLR), которую можно использовать с WCF начиная с версии 3.5 sp1.

Я бы не рекомендовал использовать его, поскольку он дает вам очень мало контроля над сериализацией (атрибуты пространства имен ...), и он связывает ваши сервисные объекты с вашими бизнес-объектами (что может совпадать с POCO)

4 голосов
/ 24 марта 2011

В любом случае, вот лучшая история из "Программирование служб WCF, 3-е издание"

Хотя использование атрибута Serializable является работоспособным, он не идеален для ориентированного на службы взаимодействия между клиентами и службами.Вместо того, чтобы обозначать все элементы в типе как сериализуемые и, следовательно, являющиеся частью схемы данных для этого типа, было бы предпочтительнее использовать подход с подпиской, при котором включаются только те элементы, которые разработчик контракта хочет явно включить в контракт данных.Атрибут Serializable заставляет тип данных быть сериализуемым, чтобы его можно было использовать в качестве параметра в операции контракта, и он не предлагает четкого разделения между возможностью использовать тип в качестве параметра операции WCF (аспект «обслуживания» втип) и возможность его сериализации.Атрибут не поддерживает псевдонимы имен или членов типов или сопоставление нового типа с заранее заданным контрактом данных.Атрибут работает непосредственно с полями-членами и полностью обходит любые логические свойства, используемые для доступа к этим полям.Было бы лучше, чтобы эти свойства добавляли свои значения при доступе к полям.Наконец, нет прямой поддержки управления версиями, потому что средство форматирования предположительно собирает всю информацию о версиях.Следовательно, со временем сложно справляться с версиями.

...