Я получаю исключение
The type KML.Placemark was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
Когда я пытаюсь сериализовать свои объекты.Я знаю о двух разных решениях этого исключения, но ни одно из них не работает в этом случае.
Некоторый фон:
У меня есть Class-структура, которая близко следует за GoogleEarth/ OpenGIS Формат KML (для рисования поверх GoogleEarth).
Мой корневой тип - KMLDocument
, который содержит набор KMLObjects
:
public class KMLDocument
{
public KMLObject[] members;
}
И KMLObject
является базовым типом для Feature
, который является базовым типом для Placemark
Проблема:
Когда ясоздайте сериализатор для KMLDocument, он не будет напрямую знать о производных типах, таких как Placemark
, если я не скажу это явно.Поэтому я делаю это следующим образом:
XmlSerializer serializer = new XmlSerializer(typeof(KMLDocument),
new Type[] { typeof(KMLObject),
typeof(Feature),
typeof(Placemark) } );
Я также прикрепляю атрибуты к классу KMLDocument
, чтобы убедиться, что он знает обо всех важных типах:
[XmlRootAttribute("kml", Namespace="http://www.opengis.net/kml/2.2")]
[XmlInclude(typeof(KMLObject))]
[XmlInclude(typeof(Feature))]
[XmlInclude(typeof(Placemark))]
public class KMLDocument
{ .... }
Но, несмотря на сообщениеСериализатор о Placemark
двумя разными способами, когда я вызываю serialize, я получаю исключение:
static void Main(string[] args)
{
KMLDocument kml = new KMLDocument();
kml.AddPlacemark("MyPlacemark", "MyTest");
XmlSerializer serializer = new XmlSerializer(typeof(KMLDocument),
new Type[] { typeof(KMLObject),
typeof(Feature),
typeof(Placemark) } );
serializer.Serialize(new StreamWriter("MyKML.kml"), kml); // Exception on this line!
}
Если я добавляю фиктивную переменную типа Placemark, вдруг сериализатор может найти тип, и он работаетправильно:
public class KMLDocument
{
public KMLObject[] members;
public Placemark dummy_var; // Should NOT be needed!
}
Чего мне не хватает?Почему и мой конструктор XmlSerializer и мои атрибуты не предоставляют важную информацию?