为啥我不能在 XNA 中保存我的 Xbox 360 游戏?
Posted
技术标签:
【中文标题】为啥我不能在 XNA 中保存我的 Xbox 360 游戏?【英文标题】:Why can't I save my Xbox 360 game in XNA?为什么我不能在 XNA 中保存我的 Xbox 360 游戏? 【发布时间】:2013-01-01 00:20:47 【问题描述】:我在保存我的游戏时遇到问题,我花了几个小时寻找解决方案,但没有任何运气。我使用了写在某人博客中的这段代码:
public class SaveandLoad
StorageDevice device;
string containerName = "ChainedWingsContainer";
string filename = "mysave.sav";
public struct SaveGame
public int s_mission;
public void InitiateSave()
if (!Guide.IsVisible)
device = null;
StorageDevice.BeginShowSelector(PlayerIndex.One, this.SaveToDevice, null);
void SaveToDevice(IAsyncResult result)
device = StorageDevice.EndShowSelector(result);
if (device != null && device.IsConnected)
SaveGame SaveData = new SaveGame()
s_mission = Game1.mission,
;
IAsyncResult r = device.BeginOpenContainer(containerName, null, null);
result.AsyncWaitHandle.WaitOne();
StorageContainer container = device.EndOpenContainer(r);
if (container.FileExists(filename))
container.DeleteFile(filename);
Stream stream = container.CreateFile(filename);
XmlSerializer serializer = new XmlSerializer(typeof(SaveGame));
serializer.Serialize(stream, SaveData);
stream.Close();
container.Dispose();
result.AsyncWaitHandle.Close();
public void InitiateLoad()
if (!Guide.IsVisible)
device = null;
StorageDevice.BeginShowSelector(PlayerIndex.One, this.LoadFromDevice, null);
void LoadFromDevice(IAsyncResult result)
device = StorageDevice.EndShowSelector(result);
IAsyncResult r = device.BeginOpenContainer(containerName, null, null);
result.AsyncWaitHandle.WaitOne();
StorageContainer container = device.EndOpenContainer(r);
result.AsyncWaitHandle.Close();
if (container.FileExists(filename))
Stream stream = container.OpenFile(filename, FileMode.Open);
XmlSerializer serializer = new XmlSerializer(typeof(SaveGame));
SaveGame SaveData = (SaveGame)serializer.Deserialize(stream);
stream.Close();
container.Dispose();
//Update the game based on the save game file
Game1.mission = SaveData.s_mission;
但是每当我运行它时,我都会收到以下消息:
Microsoft.Xna.Framework.Storage.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:在此 PlayerIndex 使用的所有先前容器都被释放之前,无法打开新容器。
我四处寻找答案,大多数建议都建议使用 Using 语句。所以我像这样使用了:
void SaveToDevice(IAsyncResult result)
device = StorageDevice.EndShowSelector(result);
if (device != null && device.IsConnected)
SaveGame SaveData = new SaveGame()
s_mission = Game1.mission,
;
IAsyncResult r = device.BeginOpenContainer(containerName, null, null);
result.AsyncWaitHandle.WaitOne();
using (StorageContainer container = device.EndOpenContainer(r))
if (container.FileExists(filename))
container.DeleteFile(filename);
Stream stream = container.CreateFile(filename);
XmlSerializer serializer = new XmlSerializer(typeof(SaveGame));
serializer.Serialize(stream, SaveData);
stream.Close();
container.Dispose();
result.AsyncWaitHandle.Close();
但我仍然得到相同的结果。我究竟做错了什么?
【问题讨论】:
【参考方案1】:post 中的人遇到了同样的问题,这是由于 using 语句范围之外的某种异常处理导致无法正确调用 dispose。尝试将您的 using 语句包装在 try catch 中。
另外,我发现这个post 在寻找解决方案时很有帮助。
祝你好运。
【讨论】:
太棒了!我尝试了 Try and Catch,它奏效了。现在我可以完美地保存和加载。但是我在 catch 块中放了什么?我不明白那是为了什么。我知道这是例外情况,但是什么样的? 没关系。我找到了它的用途。感谢一百万一次的收获。以上是关于为啥我不能在 XNA 中保存我的 Xbox 360 游戏?的主要内容,如果未能解决你的问题,请参考以下文章
在进行 XNA 开发时,有没有办法验证代码是不是可以在 360 上运行?