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で簡易チェックのため
まあを使用してC#クラスにXMLを変換することができ、XML内のルート・オブジェクトは 'UIScheme'、あなたのクラス階層でit'sながら' BaseStage'です。 – HimBromBeere
'BaseStage'のサブクラスがファイルにシリアライズされていることを事前に知っていないので、どのタイプを' XmlSerializer'に渡すのかを事前に知っていないという問題はありますか? @HimBromBeereが示すように、ルートXML要素は 'BaseStage'に対応していないので、' UIScheme'とはまったく異なるものに相当します。 – dbc