使用代理的Xml反序列化
本文关键字:Xml 反序列化 代理 | 更新日期: 2023-09-27 17:50:59
我遇到了一个关于XML类的反序列化的问题。我需要为illist使用代理,因为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; }
}
}
DTO对象可能是最干净的。当您尝试序列化数据库对象时,可能会出现一系列问题。但是,如果您仍然打算序列化对象,这里有一个可能的解决方案:
公共类EmailCategory{[XmlAttribute (" Id "))公共虚拟长Id {get;设置;}[XmlAttribute("名字")]公共虚拟字符串名称{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…这可能是个好主意),然后在代理属性中适当地键入checking。