我遇到了关于XML类的反序列化的问题。我需要为IList使用代理,因为XML不会在接口上序列化/反序列化。我需要使用此代理,因为NHibernate不接受列表并且只接受接口。我的问题只在反序列化时。 序列化工作正常。
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 :(得分:0)
DTO对象可能是最干净的。当您尝试序列化数据库对象时,可能会出现一系列问题。但是,如果您仍打算序列化对象,可以使用以下解决方案:
公共类EmailCategory { [XmlAttribute( “ID”)] public virtual long Id {get;组; } [XmlAttribute( “名称”)] 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
集合(因此它不会为null ...无论如何这可能是一个好主意)然后适当地在代理属性中键入检查