2017-10-05 2 views
0

2日目私は自分の問題を解決しようとしています。 =/ゲームUI XMLデシリアライザ

私は自分のプロジェクトのために、各ステージ(またはスクリーンには名前をつけています)にXMLを取り込み、そのオブジェクトをビルドするUIを実行しようとしています。

は基本的に、私のコードは以下のようになります。舞台のため

基本クラスを - 他のすべてがこの1から継承されます。

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

いくつかのUIクラス:

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 

マイXMLファイル:

<?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> 

私は数多くのバリエーションを試しましたが、シリアライザにこれらのオブジェクトをロードするように強制する方法はありません=/ XmlSerializerをオーバーライドしようとしましたが、自分の読み込み関数を書き込もうとしましたが、 Googleで簡易チェックのため

+1

まあを使用してC#クラスにXMLを変換することができ、XML内のルート・オブジェクトは 'UIScheme'、あなたのクラス階層でit'sながら' BaseStage'です。 – HimBromBeere

+0

'BaseStage'のサブクラスがファイルにシリアライズされていることを事前に知っていないので、どのタイプを' XmlSerializer'に渡すのかを事前に知っていないという問題はありますか? @HimBromBeereが示すように、ルートXML要素は 'BaseStage'に対応していないので、' UIScheme'とはまったく異なるものに相当します。 – dbc

答えて

0

、あなたはこの1 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; } 
} 
関連する問題