Benutzerdefinierte Xml-Serialisierung von Unbekannter Typ

Versuche ich zu Deserialisieren eine benutzerdefinierte Klasse mit dem XmlSerializer und ein paar Probleme in der Tatsache, dass ich weiß nicht, den Typ, ich werde Deserialisieren (ist steckbar), und ich habe Schwierigkeiten bei der Bestimmung.

Fand ich dieser Beitrag, die sieht ähnlich aus, kann aber nicht ganz zum laufen bekommen mit meinem Ansatz, denn ich muss Deserialisieren eine Schnittstelle, die XmlSerializable.

Was ich derzeit habe ist von der form. Beachten Sie, dass ich erwarten und müssen in der Lage sein zu handhaben, sowohl in der Klasse A und der Klasse B umgesetzt werden über ein plugin. Also, wenn ich kann vermeiden Sie die IXmlSerializable - (was-glaube ich-nicht kann), dann wäre das großartig.

Den ReadXml für Eine ist das, was ich stecken geblieben bin. Jedoch, wenn dort sind andere änderungen, die ich machen kann um das system zu verbessern, dann bin ich glücklich, dies zu tun.

public class A : IXmlSerializable
{
   public IB MyB { get; set;}

   public void ReadXml(System.Xml.XmlReader reader)
   {
      //deserialize other member attributes

      SeekElement(reader, "MyB");
      string typeName = reader.GetAttribute("Type");

      //Somehow need to the type based on the typename. From potentially 
      //an external assembly. Is it possible to use the extra types passed 
      //into an XMlSerializer Constructor???
      Type bType = ???

      //Somehow then need to deserialize B's Members
      //Deserialize X
      //Deserialize Y
   }

   public void WriteXml(System.Xml.XmlWriter writer)
   {
      //serialize other members as attributes

      writer.WriteStartElement("MyB");
      writer.WriteAttributeString("Type", this.MyB.GetType().ToString());
      this.MyB.WriteXml(writer);
      writer.WriteEndElement();
   }

   private void SeekElement(XmlReader reader, string elementName)
   {
      ReaderToNextNode(reader);
      while (reader.Name != elementName)
      {
         ReaderToNextNode(reader);
      }
   }

   private void ReaderToNextNode(XmlReader reader)
   {
      reader.Read();
      while (reader.NodeType == XmlNodeType.Whitespace)
      {
         reader.Read();
      }
   }
}

public interface IB : IXmlSerializable
{
}

public class B : IB
{

     public void ReadXml(XmlReader reader)
     {
         this.X = Convert.ToDouble(reader.GetAttribute("x"));
         this.Y = Convert.ToDouble(reader.GetAttribute("y"));
     }

   public void WriteXml(XmlWriter writer)
   {
      writer.WriteAttributeString("x", this.X.ToString());
      writer.WriteAttributeString("y", this.Y.ToString());
   }
}

HINWEIS : Aktualisiert, als ich merkte, B soll um Schnittstelle zu verwenden, IB. Sorry für die etwas falsche Frage.

InformationsquelleAutor Ian | 2009-07-02

Schreibe einen Kommentar