使用代理的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; }
        }
    }

使用代理的Xml反序列化

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。