Estou muito confuso sobre o DataContract
atributo no WCF. De acordo com meu conhecimento, é usado para serializar tipos definidos pelo usuário, como classes. Eu escrevi uma classe que é exposta no lado do cliente assim.
[DataContract]
public class Contact
{
[DataMember]
public int Roll { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Address { get; set; }
[DataMember]
public int Age { get; set; }
}
Está funcionando corretamente, mas quando removo DataContract
e DataMember
também funciona corretamente. Não consigo entender por que está funcionando corretamente. Alguém pode me dizer qual é o uso real DataContract
?
Meu contrato de serviço se parece com isso
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
Contact XmlData(string id);
}
Respostas:
Como muitos programadores ficaram impressionados com os atributos
[DataContract]
e[DataMember]
, com o .NET 3.5 SP1, a Microsoft fez com que o serializador de contrato de dados lidasse com todas as classes - mesmo sem nenhum desses atributos -, como o antigo serializador XML.Portanto, no .NET 3.5 SP1, você não precisa mais adicionar atributos de contrato ou membro de dados - caso contrário, o serializador de contrato de dados serializará todas as propriedades públicas da sua classe, como faria o serializador de XML.
NO ENTANTO: ao não adicionar esses atributos, você perde muitos recursos úteis:
[DataContract]
, você não pode definir um espaço para nome XML para seus dados residirem[DataMember]
, você não pode serializar propriedades ou campos não públicos[DataMember]
, você não pode definir uma ordem de serialização (Order=
) e o DCS serializará todas as propriedades em ordem alfabética[DataMember]
, você não pode definir um nome diferente para sua propriedade (Name=
)[DataMember]
, você não pode definir coisas comoIsRequired=
ou outros atributos úteis[DataMember]
, você não pode excluir certas propriedades públicas - todas as propriedades públicas serão serializadas pelo DCSPortanto, para uma solução "rápida e noventa", deixar de lado os atributos
[DataContract]
e[DataMember]
funcionará - mas ainda é uma boa ideia incluí- los em suas classes de dados - apenas para ser mais explícito sobre o que você está fazendo e para se dar acesso a todos esses recursos adicionais que você não obtém sem eles ...fonte
[DataContract]
e[DataMember]
... mas assim que você começar a usar um desses atributos, esse comportamento "padrão" deixará de funcionar - assim que você tiver um único[DataMember]
no seu classe, a partir desse ponto, apenas as propriedades com esse atributo serão serializadas.Em termos de WCF, podemos nos comunicar com o servidor e o cliente através de mensagens. Para transferir mensagens e de um possível cliente de segurança, precisamos criar dados / mensagens em um formato serializado.
Para serializar dados, usamos os atributos [datacontract] e [datamember]. No seu caso, se você estiver usando o
datacontract
WCF, o WCF utilizaráDataContractSerializer
outra,XmlSerializer
que é a técnica de serialização padrão.Deixe-me explicar em detalhes:
basicamente o WCF suporta 3 tipos de serialização:
XmlSerializer : - A ordem padrão é igual à classe
DataContractSerializer / NetDataContractSerializer : - A ordem padrão é em ordem alfabética
XmlSerializer : - O esquema XML é extenso
DataContractSerializer / NetDataContractSerializer : - O esquema XML está restrito
XmlSerializer : - Suporte a versão não é possível
DataContractSerializer / NetDataContractSerializer : - O suporte à versão é possível
XmlSerializer : - Compatibilidade com ASMX
DataContractSerializer / NetDataContractSerializer : - Compatibilidade com o .NET Remoting
XmlSerializer : - Atributo não necessário no XmlSerializer
DataContractSerializer / NetDataContractSerializer : - Atributo necessário nesta serialização
então o que você usa depende de seus requisitos ...
fonte
Um contrato de dados é um contrato formal entre um serviço e um cliente que descreve abstratamente os dados a serem trocados. Ou seja, para se comunicar, o cliente e o serviço não precisam compartilhar os mesmos tipos, apenas os mesmos contratos de dados. Um contrato de dados define com precisão, para cada parâmetro ou tipo de retorno, quais dados são serializados (transformados em XML) a serem trocados.
O Windows Communication Foundation (WCF) usa um mecanismo de serialização chamado Data Contract Serializer por padrão para serializar e desserializar dados (convertê-los para e do XML). Todos os tipos primitivos do .NET Framework, como números inteiros e seqüências de caracteres, bem como certos tipos tratados como primitivos, como DateTime e XmlElement, podem ser serializados sem outra preparação e são considerados como tendo contratos de dados padrão. Muitos tipos do .NET Framework também possuem contratos de dados existentes.
Você pode encontrar o artigo completo aqui.
fonte
Um contrato de dados é um contrato formal entre um serviço e um cliente que descreve abstratamente os dados a serem trocados.
O contrato de dados pode ser explícito ou implícito. Um tipo simples como int, string etc tem um contrato de dados implícito. O objeto definido pelo usuário é explícito ou do tipo Complex, para o qual é necessário definir um contrato de dados usando os atributos [DataContract] e [DataMember].
Um contrato de dados pode ser definido da seguinte maneira:
Descreve o formato externo dos dados transmitidos para e das operações de serviço
Ele define a estrutura e os tipos de dados trocados nas mensagens de serviço
Precisamos incluir a referência System.Runtime.Serialization no projeto. Este assembly contém os atributos DataContract e DataMember.
fonte
Contrato de dados: especifica que sua classe de entidade está pronta para o processo de serialização.
Membros dos dados: especifica que o campo específico faz parte do contrato de dados e pode ser serializado.
fonte
Além disso, quando você chama da solicitação http, ela funciona corretamente, mas quando você tenta ligar da net.tcp, dessa vez, obtém todo esse tipo de coisa
fonte
O atributo DataMember não é obrigatório para adicionar aos dados de serialização. Quando o atributo DataMember não é adicionado, o XMLSerializer antigo serializa os dados. A adição de um DataMember fornece propriedades úteis, como order, name, isrequired que não podem ser usadas de outra forma.
fonte