2016-12-15 5 views
0

私はかなり新しいMVC開発者です。私はXMLにシリアル化するのに少し問題があります。ナビゲーションのプロパティを使用したXMLシリアル化

は、私は現在、以下のクラスがあります。

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

をし、問題が来る:

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でから呼び出すシリアライザ方法 - 私は次のようです。私がシリアル化しようとすると、Userクラスのナビゲーションプロパティは "GetType"呼び出しで反射型のエラーを返します。それは彼らなしでうまく動作します(私は電話なしでユーザーリストを正しくエクスポートできました)。

私には何が欠けていますか?私はもっ​​とうまくいくものがありますか?

ありがとうございます!

+0

は、あなたが例外を取得していると仮定すると、あなたは、例外の種類、メッセージを含む例外の完全な 'のToString()'出力を共有することができますトレースバックと内部例外? – dbc

+0

あなたが取得しようとしているエラーは 'System.Collections.Generic.ICollectionタイプのメンバーUserClass.Phoneをシリアル化できません1 [[Phone]]はインターフェースなので?それは私がここで[mcve]を作成しようとしたときに表示されるエラーです:https://dotnetfiddle.net/NF9BpZ – dbc

+0

はい、まさにエラーImを得ることです –

答えて

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

インターフェイスICollectionをこのインターフェイスの実装に置き換える必要があります。

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

で:

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

をそれとももUserClassIXmlSerializableを実装し、独自のシリアル化のロジックを提供することによって、このコレクションをシリアル化する方法を説明することができます

例えば、交換してください。

+0

私はこれをやった後、私はまだ同じ問題を抱えていました。反射型の場合)。 –

+0

質問に正確なエラーメッセージを追加できますか? –

関連する問題