带有导航属性的XML序列化

时间:2016-12-15 03:47:26

标签: c# xml serialization

我是一个非常新的MVC开发人员,我在为我的类序列化XML时遇到了一些麻烦。

我目前有以下课程:

  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; }
}

我从UserController调用的序列化方法如下:

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);
   }

然后是问题。当我尝试序列化时,User类的导航属性在“GetType”调用中给出了反射类型错误。没有它们就可以正常工作(我能够正确导出用户列表,没有电话)。

我错过了什么?有什么我可以做得更好吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您必须使用此接口的实现替换接口ICollection

例如,替换:

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

使用:

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

或者您也可以在UserClass中实现IXmlSerializable,并通过提供自己的序列化逻辑来描述如何序列化此集合。

答案 1 :(得分:0)

我设法通过以下方式解决问题:

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");