WCF TIPS–Trabalhando com Data Contract Serialization Events

Services & WCF

Este post nasceu de uma necessidade durante uma implementação em WCF (Windows Communication Foundation). Como já sabemos, em WCF temos de trabalhar com serialização de dados. O que pode ocorrer, é a necessidade algum tipo de tratamento antes ou após este processo. Para isso temos os Eventos de Serialização, que vou exemplificar aqui.

CAPA

 

O .NET traz o suporte aos Eventos de Serialização que são utilizados pelo WCF quando trabalhamos com Data Contracts. Antes de ir para o “mão na massa”, vamos entender quais são os eventos envolvidos na serialização de dados do WCF, são eles:

  • OnSerializing
  • OnSerialized
  • OnDeserializing
  • OnDeserialized

Para realizar esta tarefa é necessário criar métodos para manipular os eventos por meio do uso de method attributes. Exatamente como no exemplo abaixo:

COD01

O método pode ter qualquer nome, porém deve ser void e ter como parâmetro a struct StreamingContext. Outro ponto importante é que os métodos devem pertencer a uma classe decorada com o atributo DataContract.

Quando aos eventos, podemos dividi-los  em dois blocos:

IMG01

Onde temos o OnSerializing que ocorre antes da serialização, e o OnSerialized que ocorre ao final do processo de serialização. Para mais detalhes consultes os links na área de referência ao final do post.

IMG02

O segundo bloco segue a mesma mecânica, só que agora no sentido inverso, a deserialização. Temos o OnDeserializing que ocorre  antes da deserialização, e o OnDeserialized que ocorre no fim da deserialização.

 

Vamos a Demo

Crie uma aplicação do tipo WCF Service Libary. Vamos utiliza o próprio serviço criado, fazendo apenas algumas customizações.

IMG03

Acesse a interface IService1 e deixe apenas a propriedade StringValue.

COD02

Na classe Service1 realiza a alteração abaixo, na implementação do método GetDataUsingDataContract:

COD03

Agora vamos fazer criar um cliente para consumir e testar o serviço. Crie um novo projeto na mesma solução do tipo Console Application e adicione a referência ao serviço.

COD04

Clique com o botão direito sobre o projeto cliente e no menu Debug clique em Start new instance, e observe o resultado.

IMG04

Vamos analisar o que ocorreu. Na primeira chamada estamos criando o objeto e informando um valor. Na segunda chamada estamos criando outro objeto porém sem informar nenhum valor para a propriedade StringValue. Logo, teremos o valor informado exibido na primeira chamada, e um retorno vazio na segunda chamada.

Agora vamos fazer um tratamento para o momento em que o dado é deserializado. Para isso vamos incluir o seguinte código na classe CompositeType.

COD05

Agora, considere um cenário de tempo real em que o usuário não informou um determinado valor, neste caso vamos precisar tratar isso em algum momento.

Em nosso caso o tratamento está sendo realizado no para o evento OnDeserialized, logo no fim da deserilização haverá o tratamento específico.

Rode novamente a aplicação. Para comprovar o que estou falando você pode simplesmente colocar um breakpoint em cada um dos métodos para testar a sequência em que os eventos são executados.

Agora, na segunda chamada, quando o manipulador apontar para o fim da deserialização, como não informamos um valor para a propriedade StringValue, nosso tratamento irá setar o valor de não informado, exatamente como o mostrado na imagem abaixo:

IMG05

Essa é apenas uma dica de algo que para mim foi muito útil.

 

Referências & Código fonte

Serialization and Deserialization

Programming WCF Services, 3rd Edition

Baixe o código fonte aqui!!!


Author's profile picture

Vitor is a computer scientist who is passionate about creating software that will positively change the world we live in.

MVP Azure - Cloud Architect - Data science enthusiast


3 minutes to read