Поделиться через


Класс System.Runtime.Serialization.DataContractAttribute

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Примените атрибут DataContractAttribute к типам (классам, структурам или перечислениям), используемым в операциях сериализации и десериализации DataContractSerializer. При отправке или получении сообщений с помощью инфраструктуры Windows Communication Foundation (WCF) также следует применять DataContractAttribute к любым классам, которые хранят и управляют данными, отправленными в сообщениях. Дополнительные сведения о контрактах данных см. в разделе "Использование контрактов данных".

Кроме того, необходимо применить DataMemberAttribute любое поле, свойство или событие, которое содержит значения, которые необходимо сериализовать. Применив этот DataContractAttributeпараметр, вы явно включите DataContractSerializer сериализацию и десериализацию данных.

Осторожность

Вы можете применить DataMemberAttribute к частным полям. Помните, что данные, возвращаемые полем (даже если оно частное), проходят процессы сериализации и десериализации, и поэтому могут быть просмотрены или перехвачены злоумышленником или процессом.

Дополнительные сведения о контрактах данных см. в разделах, перечисленных в разделе "Использование контрактов данных".

Контракты данных

Контракт данных — это абстрактное описание набора полей с именем и типом данных для каждого поля. Контракт данных существует вне любой отдельной реализации, чтобы разрешить службам на разных платформах взаимодействовать. Если данные, передаваемые между службами, соответствуют одному контракту, все службы могут обрабатывать данные. Эта обработка также называется слабо связанной системой. Контракт данных также аналогичен интерфейсу в том, что контракт указывает, как должны быть доставлены данные, чтобы его можно было обрабатывать приложением. Например, контракт данных может вызывать тип данных с именем Person, имеющий два текстовых поля с именем FirstName и LastName. Чтобы создать контракт данных, примените DataContractAttribute к классу и DataMemberAttribute к любым полям или свойствам, которые необходимо сериализовать. При сериализации данные соответствуют контракту данных, который неявно встроен в тип.

Замечание

Контракт данных значительно отличается от реального интерфейса в отношении поведения наследования. Интерфейсы наследуются любыми производными типами. При применении DataContractAttribute к базовому классу производные типы не наследуют атрибут или поведение. Однако если производный тип имеет контракт данных, члены данных базового класса сериализуются. Однако необходимо применить DataMemberAttribute к новым членам в производном классе, чтобы они стали сериализуемыми.

Документы схемы XML и средство SvcUtil

При обмене данными с другими службами необходимо описать контракт данных. Для текущей DataContractSerializerверсии схемы XML можно использовать для определения контрактов данных. (Другие формы метаданных и описания могут использоваться для той же цели.) Чтобы создать xml-схему из приложения, используйте средство служебной программы метаданных ServiceModel (Svcutil.exe) с параметром командной строки /dconly . Если входные данные средства являются сборкой, по умолчанию средство создает набор xml-схем, определяющих все типы контрактов данных, найденные в этой сборке. И наоборот, можно также использовать средство Svcutil.exe для создания определений классов Visual Basic или C#, которые соответствуют требованиям xml-схем, использующих конструкции, которые могут быть выражены контрактами данных. В этом случае параметр командной строки /dconly не требуется.

Если входные данные для инструмента Svcutil.exe являются XML-схемой, по умолчанию средство создает набор классов. При изучении этих классов вы обнаружите, что DataContractAttribute было применено. Эти классы можно использовать для создания нового приложения для обработки данных, которые необходимо обмениваться с другими службами.

Вы также можете запустить средство на конечной точке, которая возвращает документ языка описания веб-служб WSDL, чтобы автоматически создать код и конфигурацию для генерации клиента Windows Communication Foundation (WCF). Созданный код включает типы, помеченные атрибутом DataContractAttribute.

Повторное использование существующих типов

Контракт данных имеет два основных требования: стабильное имя и список членов. Стабильное имя состоит из универсального идентификатора ресурса пространства имен (URI) и локального имени контракта. По умолчанию, при применении DataContractAttribute к классу, в качестве локального имени используется имя класса, а пространство имен класса, с префиксом "http://schemas.datacontract.org/2004/07/", используется в качестве URI пространства имен. Вы можете переопределить значения по умолчанию, задав свойства Name и Namespace. Вы также можете изменить пространство имен, применяя ContractNamespaceAttribute к нему. Используйте эту возможность, если у вас есть существующий тип, который обрабатывает данные точно так же, как требуется, но имеет другое пространство имен и имя класса из контракта данных. Переопределив значения по умолчанию, можно повторно использовать существующий тип и иметь сериализованные данные в соответствии с контрактом данных.

Замечание

В любом коде вместо более длинного DataContractможно использовать словоDataContractAttribute.

Управление версиями

Контракт данных также может поддерживать последующие версии самого себя. То есть, когда более поздняя версия контракта включает дополнительные данные, эти данные хранятся и возвращаются отправителю, нетронутому. Для этого реализуйте IExtensibleDataObject интерфейс.

Дополнительные сведения об использовании версий см. в разделе "Управление версиями контракта данных".