2012-04-12 2 views
3

기본 클래스 MyBase의 개체 배열이 있습니다. 이러한 객체 중 일부는 파생 클래스의 인스턴스이므로 System.Xml.Serialization.XmlSerializer을 사용하여이 배열을 직렬화하려고하면 파생 클래스에 대한 불만이 발생합니다. System.InvalidOperationException : DerivedClass 유형이 예상되지 않았습니다. 정적으로 알 수없는 형식을 지정하려면 XmlInclude 또는 SoapInclude 특성을 사용하십시오.기본 클래스 만 serialize하도록 System.Xml.Serialization.XmlSerializer에 지시하는 방법?

나는 파생 클래스를 직렬화하고 싶지 않아, 나는 분명히 (그 문제에 대한 기본 클래스 또는 [XmlInclude()]) 파생 클래스에서 [XmlIgnore()]을 넣어 싶지 않아!

XmlSerializer에서 까지는이 같은 구성원에 대해서만을 serialize하는 방법이 있습니까?

[XmlElement("Items")] 
public MyBase[] Items 
{ 
    get 
    { 
     return items.ToArray(); 
    } 
    set 
    { 
     items = new HashSet<MyBase>(value); 
    } 
} 
+1

당신이 XmlSerializer를 생성자 유형을 전달합니까? – KristoferA

+0

나는 이것을 시도했지만 제대로 작동하지 못했습니다 : 리스트 derivedTypes = new리스트 (); foreach (항목의 MyBase 항목) { derivedTypes.Add (item.GetType()); } XmlSerializer serializer = new XmlSerializer (typeof (RootItem), derivedTypes.ToArray()); – l33t

답변

1

입력 필터링, 아이템 수집에 LINQ 쿼리를 할 수있는 :

[XmlElement("Items")] 
public MyBase[] Items 
{ 
    get 
    { 
     return items.Where(item => item.GetType() == typeof(MyBase)).ToArray(); 
    } 
    set 
    { 
     items = new HashSet<MyBase>(value); 
    } 
} 
+0

.OfType 및/또는 .Cast 도 유용 할 수 있습니다. – KristoferA

+0

감사합니다. 그래도 작동하지 않습니다. serializer가 내 항목을 건너 뛰기를 계속합니다. – l33t

+0

흠, 파생되지 않은'MyBase' 아이템을 직렬화하기를 원한다고 생각 했습니까? Linq의이 비트는 정확히 'MyBase'유형이 아닌 항목을 의도적으로 건너 뜁니다. –