2010-02-05 11 views
13

Ich habe ein Szenario, in dem ich eine Klasse Ressource haben, die zwei andere Klassen darin verschachtelt hat; Aktion und RessourceURL Ich muss benutzerdefinierte xmlserializer für Ressource und Aktion aber nicht für ResourceURL schreiben. Ich habe IXmlSerializable für beide implementiert.Benutzerdefinierte XmlSerialization für verschachtelte/untergeordnete Objekte

Das Problem ist, wenn Ressource serialisiert wird, rufe ich die Action.WriteXML (XmlWriter), um die serialisierte Form der Aktion zu erhalten, aber ich kann nicht serialisierte Form von ResourceURL erhalten. Die Tags werden alle durcheinander gebracht und es fügt auch ein Tag hinzu.

Also, wie serialisieren Sie ein Objekt, das für einige geschachtelte Objekte Kundenzerrung hat, aber nicht für andere?

Antwort

17

Hier ein Beispiel WriteXml Methode:

void IXmlSerializable.WriteXml(XmlWriter writer) 
    { 
     // Simple string value: 
     writer.WriteAttributeString("Name", this.Name); 

     // Object without IXmlSerializable implementation: 
     writer.WriteStartElement("NonCustomObject"); 
     new XmlSerializer(NonCustomObjectType).Serialize(writer, this.NonCustomObject); 
     writer.WriteEndElement(); 

     // Object with IXmlSerializable implementation: 
     writer.WriteStartElement("CustomObject"); 
     (this.CustomObject as IXmlSerializable).WriteXml(writer); 
     writer.WriteEndElement(); 
    } 

Hier ist eine entsprechende ReadXml Methode:

void IXmlSerializable.ReadXml(XmlReader reader) 
    { 
     // Simple string value 
     this.Name = reader.GetAttribute("Name"); 

     // Object without IXmlSerializable implementation here: 
     reader.ReadStartElement(); 
     if (reader.Name == "NonCustomObject") 
     { 
      reader.ReadStartElement(); 
      this.NonCustomObject = new XmlSerializer(NonCustomObjectType).Deserialize(reader); 
      reader.ReadEndElement(); 
     } 

     // Object with IXmlSerializable implementation here: 
     reader.ReadStartElement(); 
     if (reader.Name == "CustomObject") 
     { 
      (this.CustomObject as IXmlSerializable).ReadXml(reader); 
      reader.ReadEndElement(); 
     } 
    } 
+0

'Deserialize()' 'kehrt als Typ object' - Sie werfen müssen, um zu bekommen der richtige Typ (hier werden C++ - Templates und Java-Generics verwendet). – Guss

+0

@Guss wie? .NET-Generika sind Java-Generics aufgrund der CLR-Unterstützung weit überlegen. C++ - Vorlagen sind noch schlechter, da sie im Voraus alle möglichen Varianten zusammenstellen müssen. –

+0

@ Mr.TA - (a) Sie haben das Problem, das ich angegeben habe, nicht bestritten, und das ist ein ernstes eklatantes Problem in .Net; (b) Ich verstehe nicht, was CLR damit zu tun hat - Generika sollen Ihnen beim Kompilieren helfen, es gibt keinen Grund, die Information danach zu behalten - es ist im Grunde genommen "sicheres Casting"; (c) Ihre Behauptung in C++ ist falsch: C++ - Vorlagen werden nur für die tatsächlich verwendeten Typen kompiliert. – Guss

Verwandte Themen