2017-06-02 7 views
0

Ich habe eine Klasse, die wie folgt aussieht:Ändern eines Namens des Elements bei der Deserialisierung von xml C#

[XmlType(TypeName = "rootType")] 
public class myClass 
{ 
    public Class1 class1; 
    public Class2 class2; 

    [XmlType(TypeName = "type1")] 
    public class class1 
    { ... class1 definition ...} 
    [XmlType(TypeName = "type2")] 
    public class class2 
    { ... class1 definition ...}  

} 

Als ich es serialisiert werden, würde die resultierende xml

<rootType> 
    <class1> 
     ... some stuff 
    <class1/> 
    <class2> 
     ... some stuff 
    <class2/> 
<rootType/> 

jedoch sein, mein Problem hier ist, dass diese xmltype-Dekorationen gerade der Klasse hinzugefügt wurden, was bedeutet, dass in früheren Versionen (welche Clients verwenden) die XML-Datei ungefähr so ​​aussieht wie

<myClass> 
    <type1> 
     ... some stuff 
    <type1/> 
    <type2> 
     ... some stuff 
    <type2/> 
<myClass/> 

Gibt es eine Möglichkeit, dass ich den Deserialisierungsprozess (oder jede andere Möglichkeit, die das löst), wenn möglich, kontrollieren kann und dieses XML mit diesen XmlType-Dekorationen zu myClass deserialisieren kann?

+0

Sie könnten einfach das alte XML transformieren und es in Ihren neuen Deserialiser einspeisen. Das ist wahrscheinlich am einfachsten. – Rook

+0

@Rook, ich bin darauf beschränkt, das alte XML nicht zu transformieren – Santi

+0

Aber wie kann XML untransformierbar sein? Sie können es im Speicher ausführen, wenn Sie die Datei zum ersten Mal laden, oder Sie können es in eine temporäre Datei umwandeln und diese laden. – Rook

Antwort

0

Ihr Problem ist vollständig gelöst.

Wenn Sie zunächst einen Serializer erstellen, fügen Sie einen XmlRootAttribute Parameter mit dem gewünschten Namen hinzu.

Zweitens, fügen Sie den Ereignishandler dem Serializer hinzu.

var serializer = new XmlSerializer(typeof(myClass), new XmlRootAttribute("myClass")); 
serializer.UnknownElement += Serializer_UnknownElement; 

Der Event-Handler sollte wie folgt aussehen:

void Serializer_UnknownElement(object sender, XmlElementEventArgs e) 
{ 
    myClass my = (myClass)e.ObjectBeingDeserialized; 

    if (e.Element.Name == "type1") 
    { 
     var ser = new XmlSerializer(typeof(myClass.Class1)); 
     using (var sr = new StringReader(e.Element.OuterXml)) 
      my.class1 = (myClass.Class1)ser.Deserialize(sr); 
    } 
    else if (e.Element.Name == "type2") 
    { 
     var ser = new XmlSerializer(typeof(myClass.Class2)); 
     using (var sr = new StringReader(e.Element.OuterXml)) 
      my.class2 = (myClass.Class2)ser.Deserialize(sr); 
    } 
} 

wie immer zu benutzen:

myClass my; 
using (var fs = new FileStream("test.xml", FileMode.Open)) 
    my = (myClass)serializer.Deserialize(fs); 

Es soll arbeiten.

+0

Ich werde es versuchen! – Santi

+0

Das hat perfekt funktioniert, danke! – Santi

Verwandte Themen