Десериализация 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 соответствующим образом.