0

私は次のクラスを持っています:

[Serializable]

public class SerialAssassin
{
    public Hero hero;
    public Point heroPB;
    public Boss boss;
    public Point bossPB;
    public Attack attack;
    public Point attackPB;
    public HPMeter bossHP;
    public Point bossHPPB;
    public PPMeter heroPP;
    public Point heroPPPB;

    public Rectangle bossRect;
    public Rectangle attackRect;

    public int heroState;
    public int stepRate;
    public int attackDirection;
    public int attackLoop;
    public int contadorPaso;
    public int contadorPasoBoss;
    public int bossTop, bossLeft;
    public int bossState;
    public int bossHealth;
    public int bossHPCap;
    public int opa;
    public int battlesWon;
    public int mainBossCounter;
    public int ppleft;
    public bool paso;
    public bool inStadium;
    public bool fading;
    public bool fightingMainBoss;
    public bool fainted;
    public string currentPokemon;
}

次のように記述された XML からのデータの読み取りに問題があります。

XmlSerializer serializer = new XmlSerializer(typeof(SerialAssassin));
TextWriter textWriter = new StreamWriter(@"..\..\Resources\saveState.xml");
serializer.Serialize(textWriter, serial);
textWriter.Close();

そこから、データの読み取り方がよくわかりません。さらに、XML は Hero、Boss、Attack、HPMeter、PPMeter のオブジェクトをシリアル化しないという事実。

ヒーロークラス:

public class Hero
    {

        int state = 0;
        int x, y;
        string path;
        Image img;


        //methods
    }

これらのオブジェクト/プリミティブをロードして使用する方法を説明していただければ幸いです。

4

2 に答える 2

3

IIRC、XmlSerializerフィールドではなくプロパティのチェック。(パブリック フィールドを使用できると思いますが、とにかくプロパティに切り替える必要があります) さらに、クラスを としてマークする必要はありませSerializable。(SerializableバイナリやSOAPシリアライザーなどの他のものに使用されます)

フィールドを public getter と public setter のプロパティに置き換えます。さらに、他のクラス ( HeroPoint、などBoss) もすべてXmlSerializerの規則に従ってシリアライズ可能であることを確認してください。

public class SerialAssassin
{
    public Hero hero { get; set; }
    public Point heroPB { get; set; }
    public Boss boss { get; set; }
    public int heroState { get; set; }
    ...

逆シリアル化するには、そのDeserializeメソッド ( http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx )を使用します。

Stream xmlInputStream = ... //get your file stream, or TextReader, or XmlReader
XmlSerializer deserializer = new XmlSerializer(typeof(SerialAssassin));
SerialAssassin assassin = (SerialAssassin)deserializer.Deserialize(xmlInputStream)

編集: サンプルHeroクラスを見ると、すべての値が非公開であると宣言されているため、その値はシリアル化されていません。代わりに公開してください。

public class Hero
{
    public int state {get; set; }
    public int x { get; set; }
    public int y { get; set; }
    public string path { get; set; }

    [XmlIgnore]
    public Image img { get; set; }
}

シリアル化できないと思わImageれるので、画像のファイルパス(またはその他の識別情報)を保存してロードできるようにすることをお勧めします。シリアライゼーション/デシリアライゼーション中に失敗しないように、そのプロパティを無視するように指示します。[XmlIgnore]XmlSerializer

于 2012-12-18T21:48:46.920 に答える
2
XmlSerializer serializer = new XmlSerializer(typeof(SerialAssassin));
SerialAssassin assassin;

using(var reader = File.OpenText(@"..\..\Resources\saveState.xml"))
{
   assassin = (SerialAssassin)serializer.Deserialize(reader);
}
于 2012-12-18T21:48:17.957 に答える