4

IList의 회원을 포함하여 XmlSerializer를 사용하는 방법 : 그러나, XmlSerializer가 문제 때문으로 실행 캐슬 액티브 나는 다음과 같은 성 활성 기록 클래스와 XmlSerializer를 사용하려고 시도하고

[ActiveRecord("Model")] 
public class DataModel : ActiveRecordBase 
{ 
    private IList<Document> documents; 

    [XmlArray("Documents")] 
    public virtual IList<Document> Documents 
    { 
     get { return documents; } 
     set 
     { 
      documents = value;  
     } 
    } 
} 

IList 인터페이스

나는이 XmlSerializer가와 추천의 제한이 다른 곳에서 읽기 : 은 (가 ....을 System.Collections.Generic.IList`1 '형의 멤버'DataModel.Documents '를 직렬화 할 수 없습니다 예외를 발생시킵니다) 이 문제를 해결하려면 대신 List<T> 인터페이스로 선언하는 것이 좋습니다.

따라서 IList<Document>List<Document>으로 변경해 보았습니다. 이로 인해 ActiveRecord가 예외를 발생시킵니다. 속성의 유형 DataModel.Documents는 인터페이스 (IList, ISet, IDictionary 또는 일반 카운터 파트) 여야합니다. ArrayList 또는 List를 속성 유형으로 사용할 수 없습니다.

그래서 질문은 다음과 같습니다. IList 멤버가 포함 된 성 ActiveRecord와 함께 XMLSerializer를 어떻게 사용합니까?

답변

3

흥미로운 ... 내가 제안 할 수있는 가장 좋은 것은 Documents[XmlIgnore]을 사용하는 것입니다. ActiveRecord는 회원을 무시하는 비슷한 방법을 사용합니까? 다음과 같이 할 수 있습니다.

[XmlIgnore] 
public virtual IList<Document> Documents 
{ 
    get { return documents; } 
    set 
    { 
     documents = value;  
    } 
} 

[Tell ActiveRecord to ignore this one...] 
[XmlArray("Documents"), XmlArrayItem("Document")] 
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
public Document[] DocumentsSerialization { 
    get { 
     if(Documents==null) return null; 
     return Documents.ToArray(); // LINQ; or do the long way 
    } 
    set { 
     if(value == null) { Documents = null;} 
     else { Documents = new List<Document>(value); } 
    } 
} 
+0

감사합니다. 작동합니다. 인터페이스가 추가 속성으로 인해 약간 오염 되긴하지만 Microsoft가 IList 직렬화 문제에 관해서 어떤 작업을하지 않는 한 실제로 많은 것을 보지 못합니다. –

+0

이 글은 버그는 아니지만 기능이며,이를 해결하기위한 방법은 데이터 전송 객체 (또는 DTO)를 사용하는 것입니다. – Vamos

1

Microsoft won't implement this 등의 작업을 할 수 있습니다. 한 가지 방법은 IList 비 제네릭을 사용하는 것입니다 :

[ActiveRecord("Model")] 
public class DataModel : ActiveRecordBase<DataModel> { 
    [XmlArray("Documents")] 
    [HasMany(typeof(Document)] 
    public virtual IList Documents {get;set;} 
} 

Here의이 버그에 대한 좀 더 많은 정보를 제공합니다.

+0

Microsoft 버그 보고서를 알려 주셔서 감사합니다. 그들은 이것을 고치지 않고 있다는 것을 정말로 빤다. 그래도 일반 목록을 사용하여 형식 안전 혜택을 잃고 싶지 않아 위의 Marc에서 제안한 솔루션으로 이동하거나 DataContractSerializer로 모든 항목을 이동해야합니다. –

관련 문제