C#에서는 XmlSerializer
을 사용하여 기본 클래스이거나 미리 파생 클래스를 모르는 개체를 deserialize하는 방법은 무엇입니까?XmlSerializer를 사용하여 형식을 미리 모른 채 기본 또는 파생 클래스 일 수있는 개체를 deserialize하려면 어떻게해야합니까?
파생 클래스는 모두 데이터 멤버를 추가합니다. 클래스 객체를 직렬화 및 비 직렬화 할 수있는 간단한 GUI를 만들었습니다. 사용자가 채우려는 필드를 기반으로 상속 된 클래스 (또는 기본 클래스)가 적절하기 때문에 객체를 직렬화합니다.
나는 직렬화에 아무런 문제가 없다. 문제는 비 직렬화입니다. XmlSerializer
클래스를 미리 알지 못해서 올바른 파생 클래스에 데이터를 직렬화하지 못하게하려면 어떻게해야합니까? 나는 현재 XmlReader
을 XML 파일의 첫 번째 노드를 읽고 그 클래스를 결정하기 위해 만들고, 그것은 내 목적을 위해 작동하는 것처럼 보입니다. 그러나 이것은 매우 비 숙련 된 솔루션처럼 보입니다.
아래에 몇 가지 샘플 코드를 게시했습니다. 어떤 제안?
BaseType objectOfConcern = new BaseType();
XmlSerializer xserializer;
XmlTextReader xtextreader = new XmlTextReader(DEFAULT_FILENAME);
do { xtextreader.Read(); } while (xtextreader.NodeType != XmlNodeType.Element);
string objectType = xtextreader.Name;
xtextreader.Close();
FileStream fstream = new FileStream(DEFAULT_FILENAME, FileMode.Open);
switch (objectType)
{
case "type1":
xserializer = new XmlSerializer(typeof(DerivedType));
objectOfConcern = (DerivedType)xserializer.Deserialize(fstream);
//Load fields specific to that derived type here
whatever = (objectOfConcern as DerivedType).NoOfstreamubordinates.ToString();
case "xxx_1":
//code here
case "xxx_2":
//code here
case "xxx_n":
//code here
//and so forth
case "BaseType":
xserializer = new XmlSerializer(typeof(BaseType));
AssignEventHandler(xserializer);
objectOfConcern = (BaseType)xserializer.Deserialize(fstream);
}
//Assign all deserialized values from base class common to all derived classes here
//Close the FileStream
fstream.Close();
아주 멋진, 감사합니다! 좋은 예를 들면 –