使用代理进行Xml反序列化

时间:2013-01-08 23:02:40

标签: c# xml nhibernate deserialization ilist

我遇到了关于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; }
        }
    }

1 个答案:

答案 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 ...无论如何这可能是一个好主意)然后适当地在代理属性中键入检查

相关问题