只是一个简单的问题。在WP7中,使用IsolatedStorageSettings.ApplicationSettings存储复杂数据真的很糟糕吗?我想保存一些类对象的集合。属性标有[DataMember]属性。
一个类的例子是,
[DataContract]
public class OfflineItem
{
[DataMember]
public string Id { get; set; }
[DataMember]
public MyItem Item { get; set; }
[DataMember]
public Dictionary<string, string> KeyValues { get; set; }
}
Collection<OfflineItems> offlineItems = new Collection<OfflineItems>();
.....
IsolatedStorageSettings.ApplicationSettings["AllOfflineItems"] = offlineItems;
我尝试了它并且它有效,但我想知道它是否是一种正确的方法,并且从长远来看会有任何性能影响吗?
答案 0 :(得分:0)
我会将我的数据(XML或Binary)序列化为IsolatedStorage中的单独文件。因为如果IsolatedStorageSettings.ApplicationSettings过于拥挤,则加载任何单个设置将花费更长的时间。
这是将对象序列化为xml
的通用方法public static string SerializeXml(object objectToSerialize)
{
using (var ms = new MemoryStream())
{
var serializer = new XmlSerializer(objectToSerialize.GetType());
serializer.Serialize(ms, objectToSerialize);
ms.Position = 0;
using (var reader = new StreamReader(ms))
{
return reader.ReadToEnd();
}
}
}
答案 1 :(得分:0)
@Jonna。我也考虑过这一个。我最终使用/调整以下通用方法来使用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&amp; App.MEASUREMENTS是包含文件名的全局字符串。
保留了一些调试行,因此可以跟踪进度。
如果您考虑迁移到Mango,可能还值得考虑使用SQL + LINQ,其中大部分都可以在那里得到解决......