2012-09-06 2 views
4

".net deserialize xml 하나 많은 알려진 객체 유형"의 다양한 조합으로 검색을 시도했지만 의미가있는 것을 찾지 못해서 지금 여기 있습니다..net xml을 여러 개의 알려진 객체 중 하나에 비 직렬화

나에게 전송 될 수있는 5 개의 관련이없는 개체 (각각 다른 스키마) 중 하나가 표시되며 해당 개체를 올바른 개체로 비 직렬화해야합니다. 그리고 물론 객체의 수/유형이 증가합니다. 디시리얼라이저가 XML 내용을 객체에 일치시키는 방법이 있습니까? 아마도 반사 (그냥 추측)입니까? 직렬화 된 객체 주위에 xml 내용 이외의 내용을 알려주는 외부 xml 래퍼가 없습니다. 이들은 이벤트, 상태 변경, 새로운 주문, 내게 알리는 다른 시스템에서 도착 메시지입니다 ...

나는이 지점에서 짐작하고있는 독자, 고유하게 식별 속성을 찾고있는 독자를 알고 있습니다. 그런 다음 적절한 유형을 사용하여 역 직렬화하도록 전환하십시오. 그건 너무 우아한 것 같지 않습니다. 모든 지침 감사

, G 다음

답변

0

사용 : XML 루트 요소 이름 (및/또는 네임 스페이스) 각 개체 유형에 대해 서로 다른 경우

Stream xml; // Contains the XML to deserialize 
XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(MyClass1), 
    new []{ typeof(MyClass2), typeof(MyClass3) }); // Add additional classes here 
object obj = xmlSerializer.Deserialize(xml); 

if(obj Is MyClass1) 
{ 
    // Do something 
} 
else if (obj is MyClass2) 
{ 
    // Do something 
} 
else if (obj is MyClass3) 
{ 
    // Do something 
} 
// And so on for other classes 
+0

이것은 나를 위해 작동하지 않았다. XmlSerializer의 생성자에 전달 된 첫 번째 형식 매개 변수는 xml의 루트 요소와 일치해야합니다. – Pradeep

+0

나는 스스로를 바로 잡아야한다. 이것은 첫 번째 매개 변수가 serializer 및 deserializer에 대해 동일한 경우에만 작동합니다. 예를 들어 첫 번째 매개 변수가 typeof (Message)이면 serialize 된 xml에 루트 요소 이 있습니다. xml이 미리 정의 된 스키마에 있고 그 스키마를 제어 할 수없는 경우에는 아마 작동하지 않을 것입니다. – Pradeep

0

, 당신이 XmlSerializer.CanDeserialize을 사용할 수 있습니다 스키마에 대해 루트 요소 이름을 점검하십시오.

XmlSerializer appleSerializer = new XmlSerializer(typeof(Apple)); 
XmlSerializer bananaSerializer = new XmlSerializer(typeof(Banana)); 
XmlSerializer carrotSerializer = new XmlSerializer(typeof(Carrot)); 

XmlReader reader = XmlReader.Create(file); 

if (appleSerializer.CanDeserialize(reader)) 
{ 
    Apple a = (Apple)appleSerializer.Deserialize(reader); 
    // ... 
} 
else if (bananaSerializer.CanDeserialize(reader)) 
{ 
    Banana b = (Banana)bananaSerializer.Deserialize(reader); 
    // ... 
} 
else if (carrotSerializer.CanDeserialize(reader)) 
{ 
    Carrot c = (Carrot)carrotSerializer.Deserialize(reader); 
    // ... 
} 
관련 문제