viernes, 28 de enero de 2011

DataContracts and Constructors

Imaginemos el siguiente escenario, tengo una clase que será un DataContract utilizado en un método de un servicio WCF y queremos inicializar una variable de esta clase en el constructor.

namespace FooNamespace
{
[ServiceContract]
public interface Foo
{
[OperationContract]
void StartProcess(FooData dataEntrada);
}

[DataContract]
public class FooData
{
[DataMember]
public string FooProperty { get; set; }

protected string InitializedData {get; set;}

public FooData()
{
InitializedData = "Hello world!";
}
}
}


Bueno pues hemos de ser consciente que esa llamada al constructor no se llamará nunca durante la deserialización.



Por lo que si queremos simular esto podemos usar los Serialization Callbacks. De esta forma en el servidor podremos tener inicializada esa clase con el valor que queramos.



namespace FooNamespace
{
[ServiceContract]
public interface Foo
{
[OperationContract]
void StartProcess(FooData dataEntrada);
}

[DataContract]
public class FooData
{
[DataMember]
public string FooProperty { get; set; }

protected string InitializedData {get; set;}

[OnDeserializing]
public void Initialize(StreamingContext context)
{
InitializedData = "Hello world!";
}
}
}

2 comentarios:

@Zpektrum dijo...

Hola, ¿Y no se le podria aplicar (hablo desde el desconocimiento de WCF) el atributo [OnDeserialize] al constructor?

Jordi Ruiz dijo...

@Zpektrum, no eso no sería posible, ya que el atributo OnDeserializingAttribute, sólo es válido para métodos, no para constructores.

Un saludo,