2017-10-05 3 views
0

le deuxième jour, j'essaie de résoudre mon problème et je pense que j'ai besoin d'aide pour le faire. =/Game UI Xml Deserializer

Donc, j'essaie de faire une interface utilisateur pour mon projet qui, pour chaque scène (ou écran, peu importe comment vous l'appelez) prendra un XML et en construira des objets.

Fondamentalement, mon code ressemble à ça:

classe de base pour ce stade - tous les autres sont héritant de celui-ci:

class BaseStage { 
    [XmlIgnore] 
    public Type Type; 
    [XmlIgnore] 
    public string XmlPath; 
    public BaseChildren UIScheme; 

    public BaseStage() 
    { 
     Type = GetType(); 
     XmlPath = "Template/" + Type.ToString().Replace("Some.Project.Namespace.", "") + ".xml"; 
    } 

    public virtual void LoadContent() 
    { 
     if (File.Exists(XmlPath)) 
     { 
      using (TextReader reader = new StreamReader(XmlPath)) 
      { 
       XmlSerializer uiDeserializer = new XmlSerializer(typeof(BaseChildren)); 
       UIScheme = (BaseChildren)uiDeserializer.Deserialize(reader); 
      } 
     } 
    } 

Quelques UI Classes:

public class BaseChildren 
{ 
    public List<BaseChildren> Children = new List<BaseChildren>(); 

    public virtual void AddChild(BaseChildrenchild) 
    { 
     Children.Add(child); 
    } 
} 

public class Dialog : BaseChildren { 
    public string Type; 
    public Rectangle Position; 
} 
public class Label : BaseChildren {} 
// ... and so on 

Mon XML fichier:

<?xml version="1.0" encoding="utf-8" ?> 
<UIScheme> 
    <Children> 
    <Dialog> 
     <Type>Blue</Type> 
     <Position> 
     <X>43</X> 
     <Y>100</Y> 
     <Width>350</Width> 
     <Height>200</Height> 
     </Position> 
    </Dialog> 
    </Children> 
</UIScheme> 

J'ai essayé de nombreuses variantes et je ne sais pas comment forcer le sérialiseur à charger ces objets =/ J'ai également essayé de remplacer XmlSerializer et j'ai essayé d'écrire ma propre fonction de lecture, mais il est difficile d'obtenir des tutoriels pour le faire correctement dans Google

+1

Eh bien, la racine de votre objet en XML est 'UIScheme', alors que dans votre hiérarchie de classe ESt' BaseStage' . – HimBromBeere

+0

Votre problème est-il que vous ne savez pas à l'avance quelle sous-classe de 'BaseStage' a été sérialisée dans le fichier, et donc ne savez pas à l'avance quel type de fichier passer à' XmlSerializer'? Parce que @HimBromBeere a noté que l'élément XML racine ne correspond pas à 'BaseStage', il correspond à quelque chose de complètement différent appelé' UIScheme'. – dbc

Répondre

0

pour l'enregistrement rapide, vous pouvez convertir XML en C# classe en utilisant celui-ci http://xmltocsharp.azurewebsites.net/

[XmlRoot(ElementName="Position")] 
public class Position { 
    [XmlElement(ElementName="X")] 
    public string X { get; set; } 
    [XmlElement(ElementName="Y")] 
    public string Y { get; set; } 
    [XmlElement(ElementName="Width")] 
    public string Width { get; set; } 
    [XmlElement(ElementName="Height")] 
    public string Height { get; set; } 
} 

[XmlRoot(ElementName="Dialog")] 
public class Dialog { 
    [XmlElement(ElementName="Type")] 
    public string Type { get; set; } 
    [XmlElement(ElementName="Position")] 
    public Position Position { get; set; } 
} 

[XmlRoot(ElementName="Children")] 
public class Children { 
    [XmlElement(ElementName="Dialog")] 
    public Dialog Dialog { get; set; } 
} 

[XmlRoot(ElementName="UIScheme")] 
public class UIScheme { 
    [XmlElement(ElementName="Children")] 
    public Children Children { get; set; } 
}