Soy un desarrollador de MVC bastante nuevo y estoy teniendo problemas para serializar mis clases en XML.

Actualmente tengo las siguientes clases:

  public class UserClass
{

    public int UserId{ get; set; }
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool LogicalDelete { get; set; }

    public virtual ICollection<Phone> Phone{ get; set; }
    [XmlIgnore]
    public virtual ICollection<EventList> Event{ get; set; }
}


public class Phone
{
    public int TelefonosId { get; set; }
    public string Phone{ get; set; }
    public bool Mobile{ get; set; }

    public int UsuarioId { get; set; }
    public virtual UserClass User { get; set; }
}

El método de serializador al que estoy llamando desde UserController es el siguiente:

public void ExportToXML()
   {
        var data = mydb.User.ToList();

        Response.ClearContent();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment;filename=testXML.xml");
        Response.ContentType = "text/xml";

        var serializer = new System.Xml.Serialization.XmlSerializer(data.GetType());
        serializer.Serialize(Response.OutputStream, data);
   }

Y luego viene el problema. Cuando intento serializar, las propiedades de navegación de la clase User me dan un error de tipo reflectante en la llamada "GetType". Funciona bien sin ellos (pude exportar la lista de usuarios correctamente, sin teléfonos).

¿Qué me estoy perdiendo? ¿Hay algo que pueda estar haciendo mejor?

¡Gracias de antemano!

0
Fede Busso 15 dic. 2016 a las 06:47

2 respuestas

La mejor respuesta

Logré solucionar el problema de la siguiente manera:

XDocument xmlDocument = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),

                new XComment("Exporting Users to XML"),

                new XElement("Users",

                    from usu in db.Users.ToList()
                    select new XElement("User", new XElement("Email", usu.Email),
                                new XElement("FirstName", usu.FirstName),
                                new XElement("LastName", usu.LastName),
                                new XElement("Deleted", usu.LogicalDelete),
                                  from tel in usu.Phones.ToList()
                                  select new XElement("Phone",
                                new XElement("Phone", tel.Phone),
                                new XElement("Mobile", tel.Mobile)))
                            ));
            xmlDocument.Save("D:\\user.xml");
0
Fede Busso 16 dic. 2016 a las 19:37

Debe reemplazar la interfaz ICollection con una implementación de esta interfaz.

Por ejemplo, reemplace:

public virtual ICollection<Phone> Phone{ get; set; }

Con:

public virtual List<Phone> Phone{ get; set; }

O también puede implementar IXmlSerializable en UserClass y describe cómo serializar esta colección proporcionando tu propia lógica de serialización.

1
Arnaud Develay 15 dic. 2016 a las 09:09