2012-03-25 61 views
0

我正在WP7遊戲上工作。我正在使用遊戲狀態管理(http://create.msdn.com/en-US/education/catalog/sample/game_state_management,但我認爲它並不重要)我將數據保存到 Microsoft.Phone.Shell中存在問題。 PhoneApplicationService.Current.StateWP7墓碑,將雪碧保存到當前狀態不起作用

如果我把有雪碧這種方法

public override void Deactivate() 
    { 
     #if WINDOWS_PHONE    
     Microsoft.Phone.Shell.PhoneApplicationService.Current.State["Score"] = Score; 
     Microsoft.Phone.Shell.PhoneApplicationService.Current.State["cloudSprite"] = cloudSprite; 
     #endif 
     base.Deactivate(); 
    } 

沒有什麼

Microsoft.Phone.Shell.PhoneApplicationService.Current.State 

在激活方法。但是,如果我刪除cloudSprite,並把那裏只有得分是int它工作正常。我不知道什麼是錯的,也許它不能處理更復雜的對象。我嘗試也浮動雙倍,這一切工作。但如果我把那些更復雜的東西放在那裏,它就不起作用。你怎麼看 ?

編輯

這是我的精靈類。我不知道如何使它可序列化。我已經加入那裏[DataContractAttribute()]和[數據成員],但它不工作

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Content; 
using System.Runtime.Serialization; 
using System.IO; 

namespace GameStateManagementSample.GameObjects 
{ 
[DataContractAttribute()] 
public class Sprite 
{ 
    [DataMember] 
    public Vector2 Position; 
    [DataMember] 
    public Vector2 Size; 
    [DataMember] 
    public Texture2D Texture; 

    [DataMember] 
    public Rectangle Rect 
    { 
     get 
     { 
      return new Rectangle((int)Position.X, (int)Position.Y, (int)Size.X, (int)Size.Y); 
     } 
    } 


    public Sprite(Vector2 position) 
    { 
     Position = position; 
    } 


    public Sprite(Vector2 position, Vector2 size) 
    { 
     Position = position; 
     Size = size; 
    } 


    public Sprite(Vector2 position, Texture2D texture) 
    { 
     Position = position; 
     Texture = texture; 
     Size = new Vector2(Texture.Width, Texture.Height); 
    } 



    public void LoadContent(string assetName, ContentManager content) 
    { 
     Texture = content.Load<Texture2D>(assetName); 

     if (Size == Vector2.Zero) 
      Size = new Vector2(Texture.Width, Texture.Height); 
    } 

    public virtual void Draw(SpriteBatch spriteBatch) 
    { 
     //spriteBatch.Draw(Texture, Rect, Color.White); 
     spriteBatch.Draw(Texture, Position, Color.White); 

    } 

    public virtual void Draw(SpriteBatch spriteBatch, Rectangle TexturePositionInSpriteSheet, Color color) 
    { 
     spriteBatch.Draw(Texture, Position, TexturePositionInSpriteSheet, color); 
    } 

    public bool Intersects(Vector2 point) 
    { 
     if (point.X >= Position.X && point.Y >= Position.Y && point.X <= Position.X + Size.X && point.Y <= Position.Y + Size.Y) 
      return true; 
     else return false; 
    } 

    public bool Intersects(Rectangle rect) 
    { 
     return Rect.Intersects(rect); 
    } 



    public static void Serialize(Stream streamObject, object objForSerialization) 
    { 
     if (objForSerialization == null || streamObject == null) 
      return; 

     DataContractSerializer ser = new DataContractSerializer(objForSerialization.GetType()); 
     ser.WriteObject(streamObject, objForSerialization); 
    } 

    public static object Deserialize(Stream streamObject, Type serializedObjectType) 
    { 
     if (serializedObjectType == null || streamObject == null) 
      return null; 

     DataContractSerializer ser = new DataContractSerializer(serializedObjectType); 
     return ser.ReadObject(streamObject); 
    } 


} 
} 

回答

0

我相信你,如果你不進行調試,其將被自動忽略的ArgumentOutOfRangeException(在這種情況下拋出異常) 。存儲在狀態字典中的項目需要可序列化。嘗試以某種方式存儲該精靈並僅保存一個鏈接(源)到狀態字典中的精靈。

+0

據我所知我沒有得到任何異常。我不知道我的精靈是否被標記爲可串行。我回家後讓你知道。哦,謝謝 – Velchester 2012-03-26 07:02:57

1

添加到State集合的對象使用DataContractSerializer序列化。確保您保存的任何內容都可以通過這種方式進行序列化。
任何序列化錯誤都會被忽略。

更新

這是你的Sprite對象的一個​​簡化版本:

[DataContract] 
public class Sprite 
{ 
    [DataMember] 
    public Vector2 Position; 

    [DataMember] 
    public Vector2 Size; 

    [DataMember] 
    public Texture2D Texture; 

    public Sprite() 
    { 
    } 

    public Sprite(Vector2 position) 
    { 
     Position = position; 
    } 

    public Sprite(Vector2 position, Vector2 size) 
    { 
     Position = position; 
     Size = size; 
    } 

    public Sprite(Vector2 position, Texture2D texture) 
    { 
     Position = position; 
     Texture = texture; 
     Size = new Vector2(Texture.Width, Texture.Height); 
    } 
} 

而這裏的它被序列化的實例和反序列化:

//雪碧系列化測試 VAR sprite1 =新的Sprite(新的Vector2(12.34f,56.78f));

Sprite sprite2; 

using (var memStr = new MemoryStream()) 
{ 
    var serializer = new DataContractSerializer(typeof(Sprite)); 
    serializer.WriteObject(memStr, sprite1); 

    memStr.Position = 0; 
    var sr = new StreamReader(memStr); 
    var serialized = sr.ReadToEnd(); 

    // serialized now looks like 
    // <Sprite xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MiscExperiments"><Position xmlns:d2p1="http://schemas.datacontract.org/2004/07/Microsoft.Xna.Framework"><d2p1:X>12.34</d2p1:X><d2p1:Y>56.78</d2p1:Y></Position><Size xmlns:d2p1="http://schemas.datacontract.org/2004/07/Microsoft.Xna.Framework"><d2p1:X>0</d2p1:X><d2p1:Y>0</d2p1:Y></Size><Texture xmlns:d2p1="http://schemas.datacontract.org/2004/07/Microsoft.Xna.Framework.Graphics" i:nil="true" /></Sprite> 

    memStr.Position = 0; 

    sprite2 = (Sprite)serializer.ReadObject(memStr); 

    // sprite2 now contains the same as 
    // sprite2.Position = { X:12.34, Y:56.78 } 
} 
+0

我編輯了我的文章。我不能使它可序列化。我的代碼在那裏。請看看它。 – Velchester 2012-03-26 15:51:54

+0

跳出來的第一件事就是你沒有無參數的構造函數。您需要進行反序列化。或者,你可以自己序列化(和去序列化)對象,然後將結果字符串添加到狀態對象。 – 2012-03-26 19:50:47

+0

我試過無參數的構造函數,它沒有工作 – Velchester 2012-03-27 15:03:32