2014-04-04 2 views
0

IXmlSerializable 인터페이스를 사용하여 단일 추상 수퍼 클래스 WorldObject에서 파생 된 일련의 하위 클래스를 XML로 직렬화하려고합니다. 내가 deserializing로 클래스를 일부 이벤트에 가입하고자하는 것처럼,이 인터페이스를 사용해야합니다.IXmlSerializable 추상 클래스 생성 예외

[XmlInclude(typeof(SubType1)) 
,XmlInclude(typeof(SubType2))] // etc, includes all subtypes 
public abstract class WorldObject : IComparable, IXmlSerializable 

public void WriteXml(System.Xml.XmlWriter writer) 
{ 
    Type[] extraTypes = new Type[8]; 
    // (...) adding types to array here 
    var worldObjectSerializer = new XmlSerializer(typeof(List<WorldObject>), extraTypes); 
} 

초기화됩니다 XmlSerializer는 런타임 오류가 발생합니다 마지막 행 : System.MissingMethodException을 :

this 대답을 사용하여, 나는 다음과 같은 코드를 내놓았다 추상 클래스를 만들 수 없습니다 'Namespace.WorldObject' . typeof(List<WorldObject>) 대신 typeof(WorldObject)을 사용하려고하면 같은 오류가 발생합니다.

here으로 표시된 모든 클래스에서 XMLRoot를 동일한 값으로 설정하려고 시도했지만 오류가 지속됩니다.

답변

1

예외를 없애는 방법을 찾지 못했지만 해결 방법을 발견했습니다. 이 솔루션은 해당 유형의 래퍼를 이름으로 쓰고 WriteXml 함수를 호출하고 end 요소를 작성합니다.

foreach (WorldObject wO in list) 
     { 
      writer.WriteStartElement(wO.GetType().ToString()); 

      wO.WriteXml(writer); 

      writer.WriteEndElement(); 
     } 

이렇게하면 추상 클래스의 구체적인 구현을 deserialize 할 수 있습니다. wO.GetType().ToString()은 구체적인 클래스와 네임 스페이스가있는 문자열을 만듭니다. 그런 다음 요소 래퍼 이름에서 유형을 수집하는 XmlSerializer을 만들 수 있습니다.

Type t = Type.GetType(reader.LocalName); 
XmlSerializer worldObjectSerializer = new XmlSerializer(t, new XmlRootAttribute(reader.LocalName)); 
관련 문제