2009-04-22 4 views
13

내가과 같이 기본 개체의 몇 가지있다 말 :사전에 형식을 모른 채 XML을 deserialize하려면 어떻게해야합니까?

[Serializable] 
public class Base 
{ 

    public string Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

[Serializable] 
public class Sub: Base 
{ 
    public List<string> Property3 { get; set; } 

    public Sub():base() 
    { 
     Property3 = new List<string>(); 
    }   
} 

그리고 나는 그렇게처럼 직렬화 :

Sub s = new Sub {Property1 = "subtest", Property2 = 1000}; 
s.Property3.Add("item 1"); 
s.Property3.Add("item 2"); 

XmlSerializer sFormater = new XmlSerializer(typeof(Sub)); 
using (FileStream fStream = new FileStream("SubData.xml", 
    FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    sFormater.Serialize(fStream, s); 
} 

어떻게 그들을 역 직렬화 할 수 있습니다, 내가 다시 올바른 클래스를 얻을 수 있도록? 내가 자료에서 내려하고 올바른 클래스가 생성 될 수있는 클래스 그것을 XML 파일을 통과 할 수있을 것 제외로

, 나는이

XmlSerializer bFormater = new XmlSerializer(typeof (Base)); 
Base newBase; 
using (FileStream fStream = new FileStream("BaseData.xml", 
    FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    newBase = (Base) bFormater.Deserialize(fStream); 
} 

뭔가를 원하는 것입니다.

XML의 루트 노드 이름을 읽고 올바른 XmlSerializer를 만들기 위해 switch 문을 사용할 수 있다고 생각했지만 간단한 방법이 있는지 궁금합니다.

+0

확인. 방금 확인 했어. 그것의 예외를 던지고. 마지막 파라를 제거했습니다. – Kirtan

+0

좋아, 더 이상 적용되지 않으므로 내 의견을 삭제했습니다. – Ray

답변

8

는 파생 클래스에 대한 XML 시리얼에게 당신의 기본 클래스에 [XmlInclude] 속성을 사용합니다. 마지막 코드 스 니펫이 올바르게 작동해야합니다.

+0

잘 작동합니다. 감사. – Ray

+1

한 가지 추가 점은 하위 클래스를 serialize 할 때 하위 클래스가 아닌 Base 클래스에서 만든 XmlSerializer를 사용해야한다는 것입니다. – Ray

+0

Base 클래스의 [Serializable, XmlInclude (typeof (Sub))] –

9

당신은 XML 파일의 루트 노드를 읽을 수있는 대신에 switch 문을 사용하여, 당신은이 같은 코드를 작성할 수 있습니다 - 제가 XML을 읽는 것보다 다른 방법이 생각하지 않습니다

Type yourType = Type.GetType("Your Type"); 
XmlSerializer xs = new XmlSerializer(yourType); 

을 경우 때문에 당신은 타입을 모른다, 당신은 아무것도 할 수 없다.

0

내가 아는 한, 이렇게하는 간단한 방법은 없습니다.

저는 개인적으로 좀 더 일반적인 솔루션을 선호합니다 (코드에서 여러 클래스를 직렬화해야 함). 유형 이름을 값과 함께 직렬화합니다.

당신은 몇 가지 세부 사항에 대한이 질문에 좀 걸릴 수 있습니다 : 그것은 만들 알아낼 수 Serialise to XML and include the type of the serialised object

관련 문제