C# IsolatedStorage读取时发生FormatException
我在应用程序设置中存储了一些项目。当我这么做的时候 这是._userSettings=IsolatedStorageSettings.ApplicationSettings 我得到一个System.FormatException。当我阅读时,我如何找出是什么导致了它?我假设某个东西在隔离存储中,不应该在那里 这是书堆C# IsolatedStorage读取时发生FormatException,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,我在应用程序设置中存储了一些项目。当我这么做的时候 这是._userSettings=IsolatedStorageSettings.ApplicationSettings 我得到一个System.FormatException。当我阅读时,我如何找出是什么导致了它?我假设某个东西在隔离存储中,不应该在那里 这是书堆 at System.Double.Parse(String s, NumberStyles style, IFormatProvider provider) at Syst
at System.Double.Parse(String s, NumberStyles style, IFormatProvider provider)
at System.Xml.XmlConvert.ToDouble(String s)
at System.Xml.XmlReader.ReadContentAsDouble()
at System.Xml.XmlDictionaryReader.XmlWrappedReader.ReadContentAsDouble()
at System.Xml.XmlDictionaryReader.ReadElementContentAsDouble()
at System.Runtime.Serialization.XmlReaderDelegator.ReadElementContentAsDouble()
at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at System.Runtime.Serialization.XmlFormatReader.ReadValue(Type type, String name, String ns, XmlObjectSerializerReadContext context, XmlReaderDelegator xmlReader)
at System.Runtime.Serialization.XmlFormatReader.ReadMemberAtMemberIndex(ClassDataContract classContract, Object& objectLocal, DeserializedObject desObj)
at System.Runtime.Serialization.XmlFormatReader.ReadClass(DeserializedObject desObj, ClassDataContract classContract, Int32 membersRead)
at System.Runtime.Serialization.XmlFormatReader.Deserialize(XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlFormatReader.InitializeCallStack(DataContract clContract, XmlReaderDelegator xmlReaderDelegator, XmlObjectSerializerReadContext xmlObjContext, XmlDictionaryString[] memberNamesColl, XmlDictionaryString[] memberNamespacesColl)
at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContract& dataContract)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream)
at System.IO.IsolatedStorage.IsolatedStorageSettings.Reload()
at System.IO.IsolatedStorage.IsolatedStorageSettings..ctor(Boolean useSiteSettings)
at System.IO.IsolatedStorage.IsolatedStorageSettings.get_ApplicationSettings()
at ShowSeek.Custom_Classes.StateManager.SetupState()
at ShowSeek.App.Application_Activated(Object sender, ActivatedEventArgs e)
at Microsoft.Phone.Shell.PhoneApplicationService.FireActivated(Boolean isExecutionContextPreserved)
at Microsoft.Phone.Execution.NativeEmInterop.FireOnResume(Boolean isExecutionContextPreserved)
Windows Phone Silverlight中的函数double.Parse实现如下:
public static double Parse(string s, NumberStyles style, IFormatProvider provider)
{
NumberFormatInfo.ValidateParseStyleFloatingPoint(style);
NumberFormatInfo instance = NumberFormatInfo.GetInstance(provider);
double result = 0.0;
try
{
Number.ParseDouble(s, style, instance, true, ref result);
return result;
}
catch (FormatException)
{
string str = s.Trim();
if (str.Equals(instance.PositiveInfinitySymbol))
{
return PositiveInfinity;
}
if (str.Equals(instance.NegativeInfinitySymbol))
{
return NegativeInfinity;
}
if (!str.Equals(instance.NaNSymbol))
{
throw;
}
return NaN;
}
}
基本上,它首先尝试将你的double读作一个数字。如果它失败了,它将尝试特殊情况下的无限,南。方法就是这样实现的,对此你无能为力。性能影响应该可以忽略不计,特别是因为在应用程序生命周期中,当您第一次尝试访问IsolatedStorageSettings.ApplicationSettings时,它只会发生一次。您以前的设置可能已更改,例如,类定义已更改 使用:
清空以前存储的设置。不要忘记在使用代码后对其进行注释。我遇到了与使用传递的InvarientCulture作为IFormatProvider时解决的相同错误
Convert.ToDouble(Text, CultureInfo.InvariantCulture);
如果您发布完整的堆栈跟踪和消息,可能会有所帮助……还可能有助于定义_usersettings的类型该类型为IsolatedStorageSettings。看起来它无法反序列化您以前在IsolatedStorageSettings中放置的内容。我想知道这怎么可能。是否您在某个时候更改了手机的语言,然后重新启动了应用程序?如果是这种情况,我该如何处理?
Convert.ToDouble(Text, CultureInfo.InvariantCulture);