Tengo un equipo de clase que contiene una lista genérica:WCF: serializar y deserializar colecciones genéricas
[DataContract(Name = "TeamDTO", IsReference = true)]
public class Team
{
[DataMember]
private IList<Person> members = new List<Person>();
public Team()
{
Init();
}
private void Init()
{
members = new List<Person>();
}
[System.Runtime.Serialization.OnDeserializing]
protected void OnDeserializing(StreamingContext ctx)
{
Log("OnDeserializing of Team called");
Init();
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnSerializing]
private void OnSerializing(StreamingContext ctx)
{
Log("OnSerializing of Team called");
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnDeserialized]
protected void OnDeserialized(StreamingContext ctx)
{
Log("OnDeserialized of Team called");
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnSerialized]
private void OnSerialized(StreamingContext ctx)
{
Log("OnSerialized of Team called");
Log(members.ToString());
}
Cuando uso esta clase en un servicio WCF, consigo tras la salida del registro
OnSerializing of Team called
System.Collections.Generic.List 1[XXX.Person]
OnSerialized of Team called
System.Collections.Generic.List 1[XXX.Person]
OnDeserializing of Team called
System.Collections.Generic.List 1[XXX.Person]
OnDeserialized of Team called
XXX.Person[]
Después de la deserialización members
es una matriz y ya no es una lista genérica, aunque el tipo de campo es IList <> (?!) Cuando intento enviar este objeto de vuelta al servicio WCF, obtengo el resultado de registro
OnSerializing of Team called
XXX.Person[]
Después de esto, mi prueba de unidad se bloquea con System.ExecutionEngineException, lo que significa que el servicio WCF no puede serializar la matriz. (Quizás porque esperaba un IList <>)
Por lo tanto, mi pregunta es: ¿Alguien sabe por qué el tipo de mi IList <> es una matriz después de deserializar y por qué no puedo serializar mi objeto de equipo por más tiempo después de eso ?
Gracias
Gracias. Eso es realmente difícil de descubrir a lo que un "yo" puede afectar. Mientras tanto, encontré otra solución, especialmente cuando necesitas un IList <> en lugar de List <> (por ejemplo, mi OR-Mapper solo puede manejar IList <> pero no List <>): en lugar de marcar el campo "members" con [ DataMember] marque la propiedad y use este código para el setter: if (value! = Null) members = new List (value); else members = new List (); Con esto la matriz deserializada se pasa al colocador que crea una nueva lista a partir de ella. –
Fabiano
La última técnica es lo que siempre hago también. Ese campo de miembro no es algo que el serializador debería estar tocando. – IDisposable
¡En segundo lugar el enfoque de la propiedad! Estoy molesto porque no pensé en eso yo mismo. – codechurn