这是一个有趣的奇怪行为(阅读:错误)。我的简单测试应用程序中有以下两种方法:
private void Save()
{
var settings = IsolatedStorageSettings.ApplicationSettings;
settings["foo"] = new DateTimeOffset(2012, 12, 12, 12, 12, 12, TimeSpan.Zero);
settings["bar"] = new DateTimeOffset(2011, 11, 11, 11, 11, 11, TimeSpan.Zero);
settings.Save();
}
private void Load()
{
var settings = IsolatedStorageSettings.ApplicationSettings;
string foo = settings["foo"].ToString();
string bar = settings["bar"].ToString();
}
当我运行我的应用程序时,我可以调用 Save 然后 Load 并获得保存的值。但是,当我停止应用程序,再次启动它并尝试加载时,有第一次机会InvalidOperationException
(在ApplicationSettings
属性内),然后设置对象为空(我的值丢失了)。异常说:
类型“System.DateTimeOffset”无法添加到已知类型列表,因为另一个类型“System.Runtime.Serialization.DateTimeOffsetAdapter”具有相同的数据合同名称“ http://schemas.datacontract.org/2004/07/System:DateTimeOffset ' 已经存在。
当我使用 ISETool.exe 查看保存到_ApplicationSettings
文件的内容时,我可以看到有两种DateTimeOffset
类型引用,这可能是问题所在。换句话说,IsolatedStorageSettings.Save()
创建一个以后无法加载的损坏文件。
如果我将不同的类型保存到“栏”设置,一切正常。仅当我保存两个或多个 DateTimeOffset 值时才会出现此问题。作为一种解决方法,我可以将所有 DateTimeOffset 值手动序列化为字符串。不过我想避免这种情况。