在我的Silverlight / XNA应用程序/游戏中,我将自定义类Level.cs保存并加载到隔离存储。我使用SharpSerializer序列化和反序列化级别。以下代码由几个关于保存和序列化的教程组合而成。代码大部分时间都在工作,但如果我重复保存并加载一个级别,通常是2或3次,我将在Load()方法中抛出一个异常。我一直无法追查此异常的原因。现在我正在通过在发生这种情况时从默认XML文件重新启动级别来处理它。
我的问题:
1。)你知道是什么导致我的异常,我该如何解决?
2。)我捕获的异常中是否还有其他详细信息可以帮助我找出造成这种情况的原因?
3。)是否有更好的方法来构造此代码?我发现的大多数例子都使用“使用”语句。这种方法对我有帮助吗?
其他详情:
奇怪的是,如果我在不保存的情况下退出应用程序然后再次运行应用程序,它将成功加载它无法加载的独立存储文件。这让我相信保存文件没有损坏,但每次我保存/加载时我可能没有正确处理一些资源,并且在运行应用程序的实例期间这些资源会积累,最终会导致此问题。
抛出异常时,Load()方法中的这一行总是抛出它:
LoadStream = LoadStorage.OpenFile(loadName, FileMode.Open);
异常描述是{“IsolatedStorageFileStream上不允许操作。”}。在我应该寻找的例外中是否还有其他相关细节?无法读取内部异常。
我的保存方法:
public void Save()
{
IsolatedStorageFile SaveStorage = null;
SaveStorage = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream SaveStream = null;
string saveLName = "levelSave_" + currentLevel.info.number + ".XML";
if (SaveStorage.FileExists(saveLName))
{
SaveStorage.DeleteFile(saveLName);
}
try
{
SaveStream = SaveStorage.CreateFile(saveLName);
var serializer = new SharpSerializer();
serializer.Serialize(currentLevel, SaveStream);
saveState = SaveState.Successful;
}
catch (Exception ex)
{
saveState = SaveState.Failed;
}
finally
{
if (SaveStream != null)
{
SaveStream.Close();
SaveStream.Dispose();
} if (SaveStorage != null)
{
SaveStorage.Dispose();
}
}
}
我的加载方法:
public Level LoadLevel(int levelNumber)
{
IsolatedStorageFile LoadStorage;
LoadStorage = IsolatedStorageFile.GetUserStoreForApplication();
Level tmpLevel;
string loadName = "levelSave_" + levelNumber + ".XML";
if (LoadStorage.FileExists(loadName))
{
IsolatedStorageFileStream LoadStream = null;
try
{
LoadStream = LoadStorage.OpenFile(loadName, FileMode.Open);
var serializer = new SharpSerializer();
tmpLevel = (Level)serializer.Deserialize(LoadStream);
}
catch (Exception ex)
{
tmpLevel = LoadLevelXML(levelNumber);
// Level failed to load from save,
// restart unsaved level from beginning
}
finally
{
if (LoadStream != null)
{
LoadStream.Close();
LoadStream.Dispose();
}
if (LoadStorage != null)
{
LoadStorage.Dispose();
}
}
}
else
{
tmpLevel = LoadLevelXML(levelNumber);
// Level save file not found,
// restart unsaved level from beginning
}
return tmpLevel;
}
我相信在Save()方法中可能不需要这段代码。我刚刚添加它以确保覆盖文件不是问题。
if (SaveStorage.FileExists(saveLName))
{
SaveStorage.DeleteFile(saveLName);
}
我也相信这两种方法中的代码都是不必要的,但我再次添加它以确保浮动的“存储”不是问题。
if (LoadStorage != null)
{
LoadStorage.Dispose();
}
在我添加其中任何一段代码之前抛出了异常。
答案 0 :(得分:0)
我觉得如果在UI线程上执行,阻止IO操作可能会抛出IllegalOperationException
。
您是否尝试在后台线程上执行序列化(例如,使用BackgroundWorker
)?
答案 1 :(得分:0)
现在,只是为了踢,给它一个旋转:
lock (SaveStorage)
{
if (SaveStorage.FileExists(saveLName))
{
SaveStorage.DeleteFile(saveLName);
}
}
答案 2 :(得分:0)
你应该使用Mutex概念..请参考这些..
http://msdn.microsoft.com/en-us/library/ff402541(v=vs.92).aspx http://forums.create.msdn.com/forums/p/94965/568077.aspx