2013-01-08 2 views
0

XML 클래스의 역 직렬화과 관련된 문제가 있습니다. XML이 인터페이스에서 직렬화/비 직렬화되지 않기 때문에 IList에 프록시를 사용해야합니다. NHibernate가 List를 받아들이지 않고 인터페이스 만 받아들이 기 때문에이 프록시를 사용해야합니다. 내 문제는 deserializing 때만입니다. 직렬화가 정상적으로 작동합니다.Xml 프록시를 사용하여 deserialization

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; } 
     } 
    } 
+0

데이터 계약/DTO 클래스를 만든 다음 오토 마퍼 또는 수동 매핑 코드를 사용하는 것이 좋습니다. 일반적으로 수행하려고하는 것과 같은 데이터베이스 객체를 사용하는 것은 나쁜 습관으로 간주됩니다. – Alistair

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

0

DTO 개체는 아마도 가장 깨끗합니다. 데이터베이스 객체를 직렬화하려고하면 모든 문제가 발생할 수 있습니다. 여전히 객체를 직렬화하려는 경우, 여기에 가능한 솔루션입니다 :

공용 클래스 EmailCategory { [있는 XmlAttribute ("ID")] public 가상 긴 이드가 {얻을; 세트; } [XmlAttribute ("Name")] public virtual string Name {get; 세트; } protected 내부 가상 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; }. deserialization 프로세스는 get 메서드를 사용하고 컬렉션에 항목을 추가합니다. null 또는 새 List 객체를 반환하기 때문에 원래 EmailBranches 컬렉션을 나타내지 않으므로 serializer는 새 EmailBranch 객체를 올바르게 deserialize하지만 잘못된 컬렉션에 추가합니다.

위와 같이 픽스는 생성자 내에 EmailBranches 콜렉션을 초기화하는 것입니다. 따라서 null이 아닐 것입니다. 어쨌든 좋은 생각입니다.) 그리고 프록시 속성을 적절하게 입력하십시오.

+0

대단히 감사합니다! deserialization 프로세스가 get 메소드를 컬렉션에 추가하기 전에 사용하고 있다는 사실을 알지 못했습니다. – RobbieK