DataContractAttribute Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Especifica que o tipo define ou implementa um contrato de dados e é serializável por um serializador, como o DataContractSerializer. Para tornar seu tipo serializável, os autores de tipos devem definir um contrato de dados para seu tipo.
public ref class DataContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)]
public sealed class DataContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)>]
type DataContractAttribute = class
inherit Attribute
Public NotInheritable Class DataContractAttribute
Inherits Attribute
- Herança
- Atributos
Exemplos
O exemplo a seguir serializa e desserializa uma classe nomeada Person à qual ela DataContractAttribute foi aplicada. Observe que as propriedades e Namespace as Name propriedades foram definidas como valores que substituem as configurações padrão.
namespace DataContractAttributeExample
{
// Set the Name and Namespace properties to new values.
[DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
class Person : IExtensibleDataObject
{
// To implement the IExtensibleDataObject interface, you must also
// implement the ExtensionData property.
private ExtensionDataObject extensionDataObjectValue;
public ExtensionDataObject ExtensionData
{
get
{
return extensionDataObjectValue;
}
set
{
extensionDataObjectValue = value;
}
}
[DataMember(Name = "CustName")]
internal string Name;
[DataMember(Name = "CustID")]
internal int ID;
public Person(string newName, int newID)
{
Name = newName;
ID = newID;
}
}
class Test
{
public static void Main()
{
try
{
WriteObject("DataContractExample.xml");
ReadObject("DataContractExample.xml");
Console.WriteLine("Press Enter to end");
Console.ReadLine();
}
catch (SerializationException se)
{
Console.WriteLine
("The serialization operation failed. Reason: {0}",
se.Message);
Console.WriteLine(se.Data);
Console.ReadLine();
}
}
public static void WriteObject(string path)
{
// Create a new instance of the Person class and
// serialize it to an XML file.
Person p1 = new Person("Mary", 1);
// Create a new instance of a StreamWriter
// to read and write the data.
FileStream fs = new FileStream(path,
FileMode.Create);
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
ser.WriteObject(writer, p1);
Console.WriteLine("Finished writing object.");
writer.Close();
fs.Close();
}
public static void ReadObject(string path)
{
// Deserialize an instance of the Person class
// from an XML file. First create an instance of the
// XmlDictionaryReader.
FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
// Create the DataContractSerializer instance.
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
// Deserialize the data and read it from the instance.
Person newPerson = (Person)ser.ReadObject(reader);
Console.WriteLine("Reading this object:");
Console.WriteLine(String.Format("{0}, ID: {1}",
newPerson.Name, newPerson.ID));
fs.Close();
}
}
}
Namespace DataContractAttributeExample
' Set the Name and Namespace properties to new values.
<DataContract(Name := "Customer", [Namespace] := "http://www.contoso.com")> _
Class Person
Implements IExtensibleDataObject
' To implement the IExtensibleDataObject interface, you must also
' implement the ExtensionData property.
Private extensionDataObjectValue As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return extensionDataObjectValue
End Get
Set
extensionDataObjectValue = value
End Set
End Property
<DataMember(Name := "CustName")> _
Friend Name As String
<DataMember(Name := "CustID")> _
Friend ID As Integer
Public Sub New(ByVal newName As String, ByVal newID As Integer)
Name = newName
ID = newID
End Sub
End Class
Class Test
Public Shared Sub Main()
Try
WriteObject("DataContractExample.xml")
ReadObject("DataContractExample.xml")
Console.WriteLine("Press Enter to end")
Console.ReadLine()
Catch se As SerializationException
Console.WriteLine("The serialization operation failed. Reason: {0}", _
se.Message)
Console.WriteLine(se.Data)
Console.ReadLine()
End Try
End Sub
Public Shared Sub WriteObject(ByVal path As String)
' Create a new instance of the Person class and
' serialize it to an XML file.
Dim p1 As New Person("Mary", 1)
' Create a new instance of a StreamWriter
' to read and write the data.
Dim fs As New FileStream(path, FileMode.Create)
Dim writer As XmlDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(fs)
Dim ser As New DataContractSerializer(GetType(Person))
ser.WriteObject(writer, p1)
Console.WriteLine("Finished writing object.")
writer.Close()
fs.Close()
End Sub
Public Shared Sub ReadObject(ByVal path As String)
' Deserialize an instance of the Person class
' from an XML file. First create an instance of the
' XmlDictionaryReader.
Dim fs As New FileStream(path, FileMode.OpenOrCreate)
Dim reader As XmlDictionaryReader = XmlDictionaryReader. _
CreateTextReader(fs, New XmlDictionaryReaderQuotas())
' Create the DataContractSerializer instance.
Dim ser As New DataContractSerializer(GetType(Person))
' Deserialize the data and read it from the instance.
Dim newPerson As Person = CType(ser.ReadObject(reader), Person)
Console.WriteLine("Reading this object:")
Console.WriteLine(String.Format("{0}, ID: {1}", newPerson.Name, newPerson.ID))
fs.Close()
End Sub
End Class
End Namespace
Comentários
Aplique o atributo DataContractAttribute aos tipos (classes, estruturas ou enumerações) que são usados em operações de serialização e desserialização pelo DataContractSerializer. Se você enviar ou receber mensagens usando a infraestrutura do WCF (Fundação de Comunicação do Windows), também deverá aplicar o elemento DataContractAttribute a qualquer classe que contenha e manipule dados enviados nas mensagens. Para obter mais informações sobre contratos de dados, confira Como usar contratos de dados.
Você também deve aplicar o DataMemberAttribute a qualquer campo, propriedade ou evento que contenha valores que você deseja serializar. Ao aplicar o DataContractAttribute, você habilita explicitamente a DataContractSerializer para serializar e desserializar os dados.
Caution
Você pode aplicar o DataMemberAttribute a campos privados. Lembre-se de que os dados retornados pelo campo (mesmo que sejam privados) são serializados e desserializados e, portanto, podem ser exibidos ou interceptados por um usuário ou processo mal-intencionado.
Para obter mais informações sobre contratos de dados, consulte os tópicos listados no Uso de Contratos de Dados.
Contratos de dados
Um contrato de dados é uma descrição abstrata de um conjunto de campos com um nome e um tipo de dados para cada campo. O contrato de dados existe fora de qualquer implementação única para permitir que serviços em diferentes plataformas interoperem. Desde que os dados passados entre os serviços estejam em conformidade com o mesmo contrato, todos os serviços poderão processar os dados. Esse processamento também é conhecido como um sistema flexívelmente acoplado. Um contrato de dados também é semelhante a uma interface na qual o contrato especifica como os dados devem ser entregues para que possam ser processados por um aplicativo. Por exemplo, o contrato de dados pode chamar um tipo de dados chamado "Pessoa" que tem dois campos de texto, chamados "FirstName" e "LastName". Para criar um contrato de dados, aplique-o DataContractAttribute à classe e aplique-o DataMemberAttribute a quaisquer campos ou propriedades que devem ser serializadas. Quando serializados, os dados estão em conformidade com o contrato de dados inserido implicitamente no tipo.
Note
Um contrato de dados difere significativamente de uma interface real em seu comportamento de herança. As interfaces são herdadas por todos os tipos derivados. Quando você aplica a DataContractAttribute uma classe base, os tipos derivados não herdam o atributo ou o comportamento. No entanto, se um tipo derivado tiver um contrato de dados, os membros de dados da classe base serão serializados. No entanto, você deve aplicar DataMemberAttribute a novos membros em uma classe derivada para torná-los serializáveis.
Documentos de esquema XML e a ferramenta SvcUtil
Se você estiver trocando dados com outros serviços, deverá descrever o contrato de dados. Para a versão atual do DataContractSerializer, um esquema XML pode ser usado para definir contratos de dados. (Outras formas de metadados/descrição podem ser usadas para a mesma finalidade.) Para criar um esquema XML do seu aplicativo, use a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) com a opção de linha de comando /dconly . Quando a entrada para a ferramenta é um assembly, por padrão, a ferramenta gera um conjunto de esquemas XML que definem todos os tipos de contrato de dados encontrados nesse assembly. Por outro lado, você também pode usar a ferramenta Svcutil.exe para criar definições de classe do Visual Basic ou C# em conformidade com os requisitos de esquemas XML que usam constructos que podem ser expressos por contratos de dados. Nesse caso, a opção de linha de comando /dconly não é necessária.
Se a entrada para a ferramenta Svcutil.exe for um esquema XML, por padrão, a ferramenta criará um conjunto de classes. Se você examinar essas classes, descobrirá que o DataContractAttribute foi aplicado. Você pode usar essas classes para criar um novo aplicativo para processar dados que devem ser trocados com outros serviços.
Você também pode executar a ferramenta em um endpoint que retorna um documento WSDL (Linguagem de Descrição dos Serviços Web) para automaticamente gerar o código e a configuração necessários para criar um cliente do WCF (Windows Communication Foundation). O código gerado inclui tipos marcados com o DataContractAttribute.
Reutilizar tipos existentes
Um contrato de dados tem dois requisitos básicos: um nome estável e uma lista de membros. O nome estável consiste no URI (identificador de recurso uniforme) do namespace e no nome local do contrato. Por padrão, quando você aplica a DataContractAttribute uma classe, ela usa o nome da classe como o nome local e o namespace da classe (prefixado com "http://schemas.datacontract.org/2004/07/") como o URI do namespace. Você pode substituir os padrões definindo as propriedades Name e Namespace. Você também pode alterar o namespace aplicando-o ContractNamespaceAttribute ao namespace. Use essa funcionalidade quando você tiver um tipo existente que processe dados exatamente como você precisa, mas tem um namespace e um nome de classe diferentes do contrato de dados. Ao substituir os valores predefinidos, você pode reutilizar seu tipo existente e garantir que os dados serializados estejam em conformidade com o contrato de dados.
Note
Em qualquer código, você pode usar a palavra DataContract em vez da forma mais longa DataContractAttribute.
Controle de versão
Um contrato de dados também pode acomodar versões posteriores de si mesmo. Ou seja, quando uma versão posterior do contrato inclui dados extras, esses dados são armazenados e retornados para um remetente intocado. Para fazer isso, implemente a IExtensibleDataObject interface.
Para obter mais informações sobre controle de versão, consulte Controle de Versão do Contrato de Dados.
Construtores
| Nome | Description |
|---|---|
| DataContractAttribute() |
Inicializa uma nova instância da classe DataContractAttribute. |
Propriedades
| Nome | Description |
|---|---|
| IsNameSetExplicitly |
Obtém se Name foi definido explicitamente. |
| IsNamespaceSetExplicitly |
Obtém se Namespace foi definido explicitamente. |
| IsReference |
Obtém ou define um valor que indica se deve preservar os dados de referência do objeto. |
| IsReferenceSetExplicitly |
Obtém se IsReference foi definido explicitamente. |
| Name |
Obtém ou define o nome do contrato de dados para o tipo. |
| Namespace |
Obtém ou define o namespace para o contrato de dados para o tipo. |
| TypeId |
Quando implementado em uma classe derivada, obtém um identificador exclusivo para esse Attribute. (Herdado de Attribute) |
Métodos
| Nome | Description |
|---|---|
| Equals(Object) |
Retorna um valor que indica se essa instância é igual a um objeto especificado. (Herdado de Attribute) |
| GetHashCode() |
Retorna o código hash dessa instância. (Herdado de Attribute) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| IsDefaultAttribute() |
Quando substituído em uma classe derivada, indica se o valor dessa instância é o valor padrão para a classe derivada. (Herdado de Attribute) |
| Match(Object) |
Quando substituído em uma classe derivada, retorna um valor que indica se essa instância é igual a um objeto especificado. (Herdado de Attribute) |
| MemberwiseClone() |
Cria uma cópia superficial do Objectatual. (Herdado de Object) |
| ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Implantações explícitas de interface
| Nome | Description |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Mapeia um conjunto de nomes para um conjunto correspondente de identificadores de expedição. (Herdado de Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Recupera as informações de tipo de um objeto, que podem ser usadas para obter as informações de tipo de uma interface. (Herdado de Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Retorna o número de interfaces de informações do tipo que um objeto fornece (0 ou 1). (Herdado de Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Fornece acesso a propriedades e métodos expostos por um objeto. (Herdado de Attribute) |