Каковы преимущества использования [DataContract], а не [Serializable] в WCF - PullRequest
27 голосов
/ 25 января 2011

Есть ли преимущества в использовании DataContract?

Ответы [ 6 ]

35 голосов
/ 25 января 2011

См. Отличное сравнение XmlSerializer и DataContractSerializer в блоге Дэна Ригсби.

Некоторые моменты в пользу DataContractSerializer:

  • примерно на 10% быстрее, чем XmlSerializer
  • будет сериализовать все, что украшено [DataMember] - даже если оно не public видимое
  • не будет сериализовать что-либо , если вы специально не скажете это ("opt-в ")
  • вы можете определить порядок, в котором элементы сериализуются, используя атрибут Order= в [DataMember]
  • , для которого не требуется конструктор без параметров для десериализации
11 голосов
/ 09 февраля 2011

Здесь есть один вопрос, на который другие еще не ответили: Что если вы используете [Serializable], но все еще используете DataContractSerializer для сериализации этого типа?Отличается ли это от сериализации типа [DataContract] с DataContractSerializer?

Ответ : это делает абсолютно никакой разницы!Причина в том, что при передаче любого поддерживаемого типа в DataContractSerializer в первом эпизоде ​​сериализации или десериализации он «измельчает» тип во внутреннюю структуру, которая содержит всю информацию о членах типа и т. Д. Затем он использует кэшированныйвнутренняя структура (сохранена с использованием динамического IL) для последующих эпизодов сериализации, никогда не возвращаясь к исходному типу.

Также, если вы сравниваете сериализацию DataContractSerializer типов [Serializable] с XmlSerializerСериализация тех же типов, вы обнаружите, что сериализация DataContract будет экспоненциально быстрее.Немного об этом видно в техническом описании сравнения производительности, доступном здесь: http://msdn.microsoft.com/en-us/library/bb310550.aspx

3 голосов
/ 25 января 2016

Нет реальной базы для сравнения, если все, что вы делаете, это сериализацию и десериализацию из XML, кроме синтаксических различий и незначительных функций. Самое мощное преимущество DataContract перед Serializable - то, что каждый, кажется, пропускает - это то, что контракты данных не являются специфичными для XML .

При работе с контрактами данных существует только две логические конструкции: контракты данных и элементы данных (члены контракта данных). В контракте данных нет таких вещей, как «элементы» или «элементы XML».

Теоретически, сериализация на основе контракта данных позволяет представить структуру объекта в любом формате обмена данными, хотя на данный момент в .NET Framework доступны только AFAIK только сериализация / десериализация XML и JSON. Однако, безусловно, можно создать сериализатор, который работает, скажем, с RDF, и я подозреваю, что существуют дополнительные сериализаторы.

Рассмотрим следующую простую архитектуру:

C #

[DataContract]
class Company
{
    [DataMember]
    public string Name { get; set }

    [DataMember]
    public Person[] People { get; set }
}

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

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

Этот контракт не относится к XML. Вы не указали ничего связанного с XML. Вы можете сериализовать экземпляр вышеупомянутой архитектуры в XML:

XML

<Company>
  <Name>...</Name>
  <People>
    <Person>
      <FirstName>James</FirstName>
      <LastName>Sunderland</LastName>
    </Person>
    ...
  </People>
</Company>

... или в JSON:

JSON

{
    "Company": {
        "Name": "...",
        "People": [
            {
                "FirstName": "James",
                "LastName": "Sunderland"
            },
            ...
        ]
    }
}

... или в любой произвольный формат обмена данными, если у вас есть сериализатор для этого формата.

Это очень мощный и гибкий инструмент, особенно если у вас есть веб-сервис, который используется несколькими типами клиентов и партнеров, или если группа пользователей вашего веб-сервиса будет расширяться в будущем:

  • JSON легче сериализовать / десериализовать на серверах JavaScript и PHP (или на любом динамическом языке),
  • XML проще для сериализации / десериализации в клиентах WCF.

Если вы не хотите ограничивать себя XML как единственным форматом обмена данными в своей архитектуре приложения, я рекомендую вам использовать DataContract. В противном случае Serializable немного более полезен только для XML.

3 голосов
/ 25 января 2011

Вы также можете иметь в виду, что DataContract более ориентирован на потребителя, чем XmlSerializer.

Хотя XmlSerializer имеет чисто техническое измерение («как мне преобразовать этот объект в XML»), DataContract является публичным представлением бизнес-концепции.

Таким образом, DataContract служит напоминанием о том, что каждое изменение, которое вы вносите в свой класс, будет влиять на потребителей и что вы неявно связаны этим контрактом. Концептуально DataContract является центральным элементом вашей сервисной архитектуры, а XmlSerializer - просто помощником.

2 голосов
/ 25 января 2011

Основные проблемы с XmlSerializer для сериализации типов .NET в XML

  • Только открытые поля или свойства типов .NET могут быть переведены в XML
  • Только классы, которые реализуют интерфейс IEnumerable
  • Классы, которые реализуют интерфейс IDictionary, такие как таблица Hash, не могут быть сериализованы Важное различие между DataContractSerializer и XMLSerializer

Практическое преимущество дизайна DataContractSerializer - лучшая производительность по сравнению с Xmlserializer.

  • Сериализация XML не указывает, какие поля или свойства типа сериализуются в XML, тогда как DataCotractSerializer
  • Явно показывает, какие поля или свойства сериализуются в XML
  • DataContractSerializer может преобразовать HashTable в XML
1 голос
/ 09 апреля 2015

Хотя этот вопрос довольно старый, но я суммирую мое понимание:

1) Datacontract дает вам возможность сериализации определенных элементов или полей с использованием атрибута (DataMember).2) Вы можете решить с помощью DataContract порядок, в котором ваши объекты будут сериализованы.

Помимо очевидных вещей, поскольку DataContract сериализует ваших открытых членов, тогда как Serializable по умолчанию сериализует ваши поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...