2016-05-14 14 views
0

Die Datenquelle, die ich verwende, sendet immer Daten mit derselben Elternklasse (Models in der XML), mit xsi: type, um den tatsächlichen Typ der Klasse zu bestimmen. Das hat gut funktioniert, bis sie begannen, dem xsi: type einen Namensraum hinzuzufügen. Jetzt wird es nicht deserialisieren, egal was ich versuche.Deserialisieren von XML mit mehreren Namespaces

Hier ist der XML:

<ModelResource xmlns:ot="http://www.example.com/otSpace"> 
    <Models xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:type="ot:myChildClass"> 
    Stuff here 
    </Models> 
</ModelResource> 

Der Wurzelknoten

[XmlRoot("ModelResource")] 
public class XmlRoot 
{ 
    [XmlElement("Models")] 
    public List<BaseObject> Bases { get; set; } 
} 

Die Elternklasse

[XmlInclude(typeof(MyChildClass))] 
public abstract class BaseObject 
{ 
} 

Das Kind Klasse

[XmlType(TypeName = "myChildClass", Namespace = "http://www.example.com/otSpace")] 
public class MyChildClass : BaseObject 
{ 
} 

Wenn ich diese XML deserialisieren, winde ich mit dem Fehler auf:

{ "Der angegebene Typ nicht erkannt wurde: name = 'myChildClass', namespace = 'http://www.example.com/otSpace', an."}

Vielen Dank für Eure Hilfe.

Antwort

1

Diese Klassen funktionieren mit Ihrem Beispiel. Ich habe gerade die Klassen die gleiche wie die Elementnamen benannt, um es einfacher zu folgen:

public class ModelResource 
{ 
    public Models Models { get; set; } 
} 

[XmlInclude(typeof(MyChildClass))] 
[XmlRoot(Namespace = "")] 
public abstract class Models 
{ 
} 

[XmlType("myChildClass", Namespace = "http://www.example.com/otSpace")] 
public class MyChildClass : Models 
{ 
    [XmlText] 
    public string Value { get; set; } 
} 

Siehe this fiddle für eine funktionierende Demo.

+0

Danke! Wenn Sie den übergeordneten Namespace explizit auf "" setzen, ist das fehlende Teil. Jetzt muss ich damit umgehen, dass MyChildClass zwar zu diesem Namespace gehört, aber keine seiner Eigenschaften zu diesem Namespace gehört, also muss ich sie alle explizit auf "" setzen, aber das ist nur "busywork". – JumboMaximus