29 agosto 2013

Constructor en un DataContract

Hoy necesitaba inicializar un atributo de una clase de un DataContract y intuitivamente la forma de hacerlo sería inicializando esa variable en el constructor de la clase. Como por ejemplo:
[DataContract]
public class Person
{
     private string _Name;

     public Person()
     {
          this.Name = "No Name";
     }

     [DataMember]
     public string Name
     {
          get { return _Name; }
          set { _Name = value; }
      }
}

Bueno pues esto no funciona. En la deserialización nunca se llaman a constructores.

Así que para solucionar esto he encontrado este maravilloso POST donde explican los eventos que ocurren en la deserialización y cómo usar los deserialization callbacks podía ser de ayuda en la resolución del problema. Así que solo necesitaba inicializar los valores que necesitaba en el evento OnSerializing.

Eventos en la serialización

Así nuestro código ahora funcional quedaría:
[DataContract]
public class Person
{
    private string _Name;
  
 [OnDeserializing]
 void OnDeserializing(StreamingContext context)
 {
  this.Name = "No Name";
 }

     [DataMember]
     public string Name
 {
  get { return _Name; }
  set { _Name = value; }
 }
}


1 comentario:

  1. ¿Podrías ser algo más amplio sobre donde y como utilizar esta funcionalidad?

    ResponderEliminar