@乔娜。我也考虑过这个。我最终使用/改编了以下通用方法来使用如下的 IsolatedStorageFile 进行序列化和反序列化。它包括在您尝试更新数据时删除已存在的文件。
internal static void Write<T>(T obj, string fileName)
{
XmlWriterSettings writerSettings = new XmlWriterSettings
{
Indent = true,
IndentChars = "\t"
};
try
{
using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (isoStore.FileExists(fileName))
{
isoStore.DeleteFile(fileName);
}
using (var isoStream = new IsolatedStorageFileStream(fileName, FileMode.Create, isoStore))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlWriter xmlWriter = XmlWriter.Create(isoStream, writerSettings))
{
serializer.Serialize(xmlWriter, obj);
}
}
}
}
catch (IsolatedStorageException ex)
{
Debug.WriteLine(ex.Message);
}
catch (Exception emAll)
{
Debug.WriteLine(emAll.Message);
}
}
internal static T Read<T>(string fileName)
{
try
{
using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var isoStream = new IsolatedStorageFileStream(fileName, FileMode.Open, isoStore))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(isoStream);
}
}
}
catch (IsolatedStorageException ex)
{
Debug.WriteLine(ex.Message);
throw;
}
catch (Exception emAll)
{
Debug.WriteLine(emAll.Message);
throw;
}
}
序列化会这样调用:
Serialization.Write<user>(userDetails, App.USERDETAILS);
这样会调用反序列化:
Items = Serialization.Read<measurements>(App.MEASUREMENTS);
user 是一个类,而 userDetails 是一个基于该类的对象。 Measurements 是一个类,Items 是基于该类的对象。 App.USERDETAILS 和 App.MEASUREMENTS 是包含文件名的全局字符串。
一些调试行已被保留,以便可以跟踪进度。
如果您正在考虑迁移到 Mango,也可能值得考虑使用 SQL + LINQ,并且可以在那里解决大部分问题...