Десериализация XML с прокси

У меня проблема с десериализацией класса 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 ответ

Решение

Объект DTO, вероятно, самый чистый. Существует целый ряд проблем, которые могут возникнуть при попытке сериализации объектов базы данных. Однако, если вы все еще намереваетесь сериализовать объект, вот возможное решение:

открытый класс EmailCategory { [XmlAttribute("Id")] открытый виртуальный длинный Id { get; задавать; } [XmlAttribute("Name")] публичная виртуальная строка 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 метод, а затем добавляет элементы в коллекцию. Так как вы возвращаете ноль или новый объект List, это не представляет оригинал EmailBranches коллекция, следовательно, сериализатор правильно десериализует новый EmailBranch объект, но добавляет его в неправильную коллекцию.

Исправление, как указано выше, заключается в инициализации EmailBranches коллекция внутри конструктора (следовательно, она не будет нулевой... что, вероятно, хорошая идея в любом случае), а затем проверка типа в свойстве proxy соответствующим образом.

Другие вопросы по тегам