【发布时间】:2017-03-12 16:29:03
【问题描述】:
我正在尝试使用 Visual Studio Community 2015 在 UWP 中制作一个日记应用程序。因此,所有日记条目都保存在 ObservableCollection 中(类型为 DiaryEntry,具有三个字符串)。在 App 类的 OnSuspending 方法中,我序列化(使用 XmlSerializer)并将 ObservableCollection 保存到应用程序的 LocalFolder。在 App 类的 OnLaunched 方法中,我将数据反序列化并再次放入 ObservableCollection。
当我在调试模式下运行此应用程序时,它每次都 100% 运行,但在发布模式下,一旦我关闭并再次打开应用程序,我就会丢失 ObservableCollection。其他时候它可以工作一两次,但我仍然会丢失数据。我想知道的是如何让我的应用在发布模式下运行?
这些是我正在使用的方法:
private async void SaveCollection(string xml)
{
//Serializing our observablecollection and saving it to the local folder
StorageFile sf = await ApplicationData.Current.LocalFolder.CreateFileAsync("Diary.txt", CreationCollisionOption.ReplaceExisting);
await Windows.Storage.FileIO.WriteTextAsync(sf, xml);
}
private async Task<string> GetSavedCollection()
{
try
{
Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile sampleFile = await storageFolder.GetFileAsync("Diary.txt");
string text = await Windows.Storage.FileIO.ReadTextAsync(sampleFile);
return text;
}
catch (FileNotFoundException e)
{
return "";
}
}
public static string ToXml(ObservableCollection<DiaryEntry> d)
{
XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<DiaryEntry>));
StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings()
{
Indent = true,
OmitXmlDeclaration = true,
};
using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, settings))
{
serializer.Serialize(xmlWriter, d);
}
return stringBuilder.ToString();
}
// Deserialize from xml
public static ObservableCollection<DiaryEntry> FromXml(string xml)
{
if (xml == "")
{
return new ObservableCollection<DiaryEntry>();
}
XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<DiaryEntry>));
ObservableCollection<DiaryEntry> value;
using (StringReader stringReader = new StringReader(xml))
{
object deserialized = serializer.Deserialize(stringReader);
value = (ObservableCollection<DiaryEntry>)deserialized;
}
return value;
}
我是这样称呼这些方法的:
日记 = FromXml(await GetSavedCollection());
SaveCollection(ToXml(Diaries));
【问题讨论】:
-
在保存数据过程中尝试写一些日志。
-
你使用哪个
NETCore.UniversalWindowsPlatform?努力达到最高。 (5.3.1)。可能这个问题与 .NET Native 工具链有关。 -
如果在您的应用的构建配置中启用了
.NET Native tool chain选项,则使用Microsoft.NETNative.Analyzer。因此,您可以看到与编译器不兼容的代码。 NuGet 包在这里 => nuget.org/packages/Microsoft.NETNative.Analyzer