2012-12-18 115 views
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 
    } 

我會很感激,如果你會這麼好心給我解釋如何加載這些對象/圖元,然後使用它們:

英雄職業。

+0

未序列化的對象是否具有[Serializable]屬性? –

+1

如果你還沒有收到答案,你期望不要發佈另一個[問題](http://stackoverflow.com/questions/13870879/serialize-a-form-along-with-all-its-data-in-c -尖銳)。嘗試以某種方式更新您之前的某個人可以按預期回答它。 – rae1

+0

@MattiasJosefsson是的,它們是可序列化的,但它們只是保存文件中的。 –

回答

3

IIRC,所述 XmlSerializer檢查屬性,而不是字段。 (我認爲它可以使用公共領域,但你真的應該切換到屬性呢)另外,不是需要標記爲Serializable。 (Serializable用於其他如二進制和SOAP串行器)

用公有的getter和setter將屬性替換爲屬性。此外,請確保您的其他類(如HeroPointBoss)都還序列化根據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忽略該屬性,以便在序列化/反序列化期間不會失敗。

+0

愚蠢的我,這是不夠的,使公開課?我認爲Image實際上是可序列化的(msdn)。編輯:沒關係。它不能被序列化。 –

+0

@ Fiire No.如果你沒有明確聲明類的成員的可見性,它總是默認爲'private';它不會繼承它聲明的類的可見性。 –

2
XmlSerializer serializer = new XmlSerializer(typeof(SerialAssassin)); 
SerialAssassin assassin; 

using(var reader = File.OpenText(@"..\..\Resources\saveState.xml")) 
{ 
    assassin = (SerialAssassin)serializer.Deserialize(reader); 
} 
相關問題