miércoles, 25 de mayo de 2011

Cannot serialize member 'Objects' of type 'System.Collections.Generic.IList`1....

Hoy me he encontrado con este problema, trantado de serializar un objeto a xml, por alguna razón no se pueden serializar objetos que contengan atributos Ilist.

La foma de la que estaba trantando es la siguiente


[Serializable]
public class Person{
public Person (){
Address = new list<Address>();
}
public String Name{set;get;}

public IList<Address> Address {set;get;}

public void ToXml() {
var serializer = new XmlSerializer(typeof(Voucher));
var writer = new XmlTextWriter(Console.Out);
serializer.Serialize(writer, this);
}
}




y obviamente ejecuto esto desde un test unitario como el que sigue:


[Test]
public void TestForPersonToXml() {
var person = new person();
Person.NAme = "victor Hugo Saavedra";
var Add = new Address();
add.street = "Alameda";
add.number = "1234";
Person.Address.add(add)

person.ToXml();
}


Pero al momento de ejecutar el test me da el siguiente error "Cannot serialize member 'Person' of type 'System.Collections.Generic.IList`1....." para lograr que la serializacion no se este error, tuve simplemente ignorar la propiedad que contiene el Ilist y generar otra que retorne una arreglo de direcciones quedando de la siguiente forma:


[Serializable]
public class Person{
public Person (){
Address = new List<Adress>();
}
public String Name{set;get;}

[XmlIgnore]
public IList<Adress> Address {set;get;}


[XmlArray("Address"), XmlArrayItem("address")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
private Address[] AddressXml{
get{
var foo = Address as List<Address>;
return foo != null ? foo.ToArray() : null;
}
set{
Address = null == value ? null : new List<Address>(value);
}
}

public void ToXml() {
var serializer = new XmlSerializer(typeof(Voucher));
var writer = new XmlTextWriter(Console.Out);
serializer.Serialize(writer, this);
}
}



Notar que el resultado de la serializacion es enviada a la salida de la consola y no se realiza ningún trabajo con ella.

Otro aspecto importante es que la clase Address debe contener el atributo [Serializable]

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

No hay comentarios:

Publicar un comentario