La coutume de la Sérialisation Xml de Type Inconnu

Je suis d'essayer de désérialiser une classe personnalisée via le XmlSerializer et le fait d'avoir quelques problèmes, dans le fait que je ne connais pas le type que je vais être la désérialisation (enfichable) et je vais avoir de la difficulté à déterminer.

J'ai trouvé ce post qui lui ressemble, mais n'arrive pas à le faire fonctionner avec ma démarche car j'ai besoin de désérialiser une interface qui est XmlSerializable.

Ce que j'ai actuellement obtenu est de la forme. Notez que j'attends et doivent être en mesure de gérer à la fois de la classe A et de classe B à être mis en œuvre par l'intermédiaire d'un plugin. Donc si je peux éviter d'utiliser le IXmlSerializable (dont je ne pense pas que je peux), alors ce serait génial.

La ReadXml pour Un est ce que je suis coincé sur. Cependant, si il y a d'autres changements que je peux faire pour améliorer le système, alors je suis heureux de le faire.

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());
   }
}

REMARQUE : le Jour que j'ai réalisé que B était censé utiliser l'interface de l'IB. Désolé un peu de mal question.

OriginalL'auteur Ian | 2009-07-02