C# WP7 IsolatedStorage异常:{“不允许对IsolatedStorageFileStream执行操作。”
在我的Silverlight/XNA应用程序/游戏中,我保存了一个自定义类Level.cs并将其加载到独立存储中。我使用SharpSerializer对该级别进行序列化和反序列化。下面的代码由几个关于保存和序列化的教程组合而成。代码大部分时间都在工作,但是如果我重复保存和加载一个级别,通常是2到3次,我会在load()方法中抛出一个异常。我一直无法找到这个异常的原因。现在,我通过在发生这种情况时从默认XML文件重新启动级别来处理它 我的问题是: 1.)您知道是什么导致了我的异常,以及如何修复它吗 2.)我捕获的异常中是否有任何其他详细信息可能有助于我追踪导致这种情况的原因 3.)是否有更好的方法来构建此代码?我发现的大多数示例都使用“using”语句。这种方法有什么优点可以帮助我吗 其他详情: 奇怪的是,如果我在不保存的情况下退出应用程序,然后再次运行该应用程序,它将成功加载它刚才未能加载的隔离存储文件。这让我相信,保存文件没有损坏,但每次保存/加载时,我可能都没有正确处理一些资源,而随着这些资源在运行应用程序的实例中积累,最终会导致此问题 抛出异常时,它总是由Load()方法中的以下行抛出: 异常描述为{“不允许对IsolatedStorageFileStream执行操作。”}。在例外情况中是否还有其他相关细节需要我查找?无法读取内部异常 我的保存方法:C# WP7 IsolatedStorage异常:{“不允许对IsolatedStorageFileStream执行操作。”,c#,silverlight,windows-phone-7,xna,isolatedstorage,C#,Silverlight,Windows Phone 7,Xna,Isolatedstorage,在我的Silverlight/XNA应用程序/游戏中,我保存了一个自定义类Level.cs并将其加载到独立存储中。我使用SharpSerializer对该级别进行序列化和反序列化。下面的代码由几个关于保存和序列化的教程组合而成。代码大部分时间都在工作,但是如果我重复保存和加载一个级别,通常是2到3次,我会在load()方法中抛出一个异常。我一直无法找到这个异常的原因。现在,我通过在发生这种情况时从默认XML文件重新启动级别来处理它 我的问题是: 1.)您知道是什么导致了我的异常,以及如何修复它吗
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();
}
异常是在我添加这些代码段之前引发的。我感觉如果在UI线程上执行,阻止IO操作可能会引发
非法操作异常
您是否尝试过在后台线程上执行序列化(例如,使用)?现在,为了好玩,请尝试一下:
lock (SaveStorage)
{
if (SaveStorage.FileExists(saveLName))
{
SaveStorage.DeleteFile(saveLName);
}
}
您应该使用互斥概念..参考这些
http://forums.create.msdn.com/forums/p/94965/568077.aspx保存什么样的代码/交互调用?如果您碰巧按了两次按钮,并且在上一个保存操作仍在执行时尝试保存,则可能会发生异常。按下按钮可调用保存。我刚刚添加了检查以查看saveState当前是否正在保存。私有void savequit按钮_单击(对象发送方,routedEventTargets e){if(saveState!=saveState.Saving){Save();NavigationService.Navigate(新Uri(“/MainPage.xaml”,UriKind.Relative));}此外,我添加了这一行,以便在Save方法中的try开始时将saveState设置为保存。试试{saveState=saveState.Saving;SaveStream=SaveStorage.CreateFile(saveLName);}好吧,格式化完全失败了。有可能Save
和Load
方法同时执行吗?尝试使用lock
语句使其线程安全出于好奇,文件有多大<默认情况下,code>IsolatedFileStore
仅支持少量数据。您还应该使用using
-语句,而不是使用try…finally
来滚动自己的语句。
lock (SaveStorage)
{
if (SaveStorage.FileExists(saveLName))
{
SaveStorage.DeleteFile(saveLName);
}
}