2013-01-08 37 views
0

我有關於XML類的反序列化的問題。我需要爲IList使用代理,因爲XML不會在接口上序列化/反序列化。我需要使用這個代理,因爲NHibernate不接受列表並只接受接口。我的問題只是在反序列化時。 序列化工作正常。Xml使用代理的反序列化

public class EmailCategory 
    { 
     [XmlAttribute("Id")] 
     public virtual long Id { get; set; } 
     [XmlAttribute("Name")] 
     public virtual string Name { get; set; } 
     protected internal virtual IList<EmailBranch> EmailBranches { get; set; } 

     [XmlArray("EmailBranches")] 
     [XmlArrayItem("EmailBranch", typeof(EmailBranch)] 
     public List<EmailBranch> EmailBranchesProxy { 
      get { return EmailBranches != null ? EmailBranches .ToList() : null; } 
      set { EmailBranches = value; } 
     } 
    } 
+0

爲什麼不創建Data Contract/DTO類,然後使用automapper或手動映射代碼?通常認爲使用數據庫對象的做法很糟糕,就像您正在嘗試的那樣。 – Alistair

+0

我已編輯您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

DTO對象可能是最乾淨的。當您嘗試序列化數據庫對象時,可能會出現一系列問題。但是,如果你還打算序列化對象,這裏有一個可能的解決方案:

公共類EmailCategory { [XmlAttribute( 「ID」)] 公共虛擬長標識{獲得;組; } [XmlAttribute(「Name」)] public virtual string Name {get;組; } 受保護的內部虛擬IList EmailBranches {get;組; } // private List _test = new List();

//[XmlArray("EmailBranches")] 
//[XmlArrayItem("EmailBranch", typeof(EmailBranch))] 
//public virtual List<EmailBranch> EmailBranchesProxy { 
// get { return EmailBranches != null ? EmailBranches.ToList() : null; } 
// set { EmailBranches = value; } 
//} 

[XmlArray("EmailBranches")] 
[XmlArrayItem("EmailBranch", typeof(EmailBranch))] 
public virtual List<EmailBranch> EmailBranchesProxy 
{ 
    get 
    { 
     var proxy = EmailBranches as List<EmailBranch>; 
     if (proxy == null && EmailBranches != null) 
     { 
      proxy = EmailBranches.ToList(); 
     } 

     return proxy; 
    } 
    set { EmailBranches = value; } 
} 

public EmailCategory() 
{ 
    EmailBranches = new List<EmailBranch>(); 
} 

}

您遇到的問題是在這條線:get { return EmailBranches != null ? EmailBranches .ToList() : null; }。反序列化過程使用get方法,然後將項目添加到集合中。由於您返回null或新的List對象,因此這並不代表原始EmailBranches集合,因此序列化程序正確地反序列化新的EmailBranch對象,但將其添加到錯誤的集合中。

修正如上所述,將在構造函數中初始化EmailBranches集合(因此它不會爲空......這可能是個好主意),然後在代理屬性中適當地鍵入檢查。

+0

非常感謝!我沒有意識到反序列化過程在將它們添加到集合之前使用get方法。 – RobbieK