如何在Windows8中序列化XMl数据。对于Metro,这些方法是异步的。对于保存,可以传递一旦保存操作完成后将调用的操作。加载数据时,您需要传递将接收加载数据的操作,以及在无法加载数据时将填充的异常参数。怎么可能。
以下是wp7中序列化的代码.. 怎么在Windows 8中不可思议?
private void SaveProfileData(Profiles profileData)
{
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
ProfileList = ReadProfileList();
using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile("profile.xml", FileMode.Create))
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Profiles>));
using (XmlWriter xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
{
serializer.Serialize(xmlWriter, GenerateProfileData(profileData));
}
}
}
}
答案 0 :(得分:2)
使用独立存储在Windows Phone上序列化为XML:
/// <summary>
/// Saves the given class instance as XML.
/// </summary>
/// <param name="fileName">Name of the xml file to save the data to.</param>
/// <param name="classInstanceToSave">The class instance to save.</param>
public static void SaveToXml(string fileName, T classInstanceToSave)
{
using (IsolatedStorageFile isolatedStorage = GetIsolatedStorageFile)
{
using (IsolatedStorageFileStream stream = isolatedStorage.OpenFile(fileName, FileMode.Create))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlWriter xmlWriter = XmlWriter.Create(stream, new XmlWriterSettings() { Indent = true }))
{
serializer.Serialize(xmlWriter, classInstanceToSave);
}
}
}
}
/// <summary>
/// Gets the Isolated Storage File for the current platform.
/// </summary>
private static IsolatedStorageFile GetIsolatedStorageFile
{
get
{
#if (WINDOWS_PHONE)
return IsolatedStorageFile.GetUserStoreForApplication();
#else
return IsolatedStorageFile.GetUserStoreForDomain();
#endif
}
}
您还需要在文件顶部“使用System.IO.IsolatedStorage”。
以下是使用Windows Storage for Windows 8 / RT和异步写入时相同代码的外观:
/// <summary>
/// Saves the given class instance as XML asynchronously.
/// </summary>
/// <param name="fileName">Name of the xml file to save the data to.</param>
/// <param name="classInstanceToSave">The class instance to save.</param>
public static async void SaveToXmlAsync(string fileName, T classInstanceToSave)
{
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlWriter xmlWriter = XmlWriter.Create(stream, new XmlWriterSettings() { Indent = true }))
{
serializer.Serialize(xmlWriter, classInstanceToSave);
}
}
}
这需要在文件顶部“使用Windows.Storage”。
使用独立存储从Windows Phone上的序列化XML读取:
/// <summary>
/// Loads a class instance from an XML file.
/// </summary>
/// <param name="fileName">Name of the file to load the data from.</param>
public static T LoadFromXml(string fileName)
{
try
{
using (IsolatedStorageFile isolatedStorage = GetIsolatedStorageFile)
{
// If the file exists, try and load it it's data.
if (isolatedStorage.FileExists(fileName))
{
using (IsolatedStorageFileStream stream = isolatedStorage.OpenFile(fileName, FileMode.Open))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
T data = (T)serializer.Deserialize(stream);
return data;
}
}
}
}
// Eat any exceptions unless debugging so that users don't see any errors.
catch
{
if (IsDebugging)
throw;
}
// We couldn't load the data, so just return a default instance of the class.
return default(T);
}
/// <summary>
/// Gets if we are debugging the application or not.
/// </summary>
private static bool IsDebugging
{
get
{
#if (DEBUG)
// Extra layer of protection in case we accidentally release a version compiled in Debug mode.
if (System.Diagnostics.Debugger.IsAttached)
return true;
#endif
return false;
}
}
以下是使用Windows Storage for Windows 8 / RT和异步读取的相同代码的外观:
/// <summary>
/// Loads a class instance from an XML file asynchronously.
/// </summary>
/// <param name="fileName">Name of the file to load the data from.</param>
public static async System.Threading.Tasks.Task<T> LoadFromXmlAsync(string fileName)
{
try
{
var files = await System.Threading.Tasks.Task.Run(() => ApplicationData.Current.LocalFolder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName));
var file = files.GetResults().FirstOrDefault(f => f.Name == fileName);
// If the file exists, try and load it it's data.
if (file != null)
{
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(fileName))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
T data = (T)serializer.Deserialize(stream);
return data;
}
}
}
// Eat any exceptions unless debugging so that users don't see any errors.
catch
{
if (IsDebugging)
throw;
}
// We couldn't load the data, so just return a default instance of the class.
return default(T);
}
/// <summary>
/// Gets if we are debugging the application or not.
/// </summary>
private static bool IsDebugging
{
get
{
#if (DEBUG)
// Extra layer of protection in case we accidentally release a version compiled in Debug mode.
if (System.Diagnostics.Debugger.IsAttached)
return true;
#endif
return false;
}
}
对我来说,这些是辅助函数,这就是为什么它们被标记为静态,但它们不需要是静态的。此外,IsDebugging功能只适用于糖。
答案 1 :(得分:1)
我构建了一个Sudoku应用程序,我遇到了同样的问题。我尝试在Visual Studio 2012中将代码从wp7更改为win 8,但我的应用程序尚未运行。也许我的代码可以帮到你。
public void SaveToDisk()
{
if (Windows.Storage.ApplicationData.Current.LocalSettings.Values.ContainsKey(key))
{
if (Windows.Storage.ApplicationData.Current.LocalSettings.Values[key].ToString() != null)
{
//do update
Windows.Storage.ApplicationData.Current.LocalSettings.Values[key] = value;
}
}
else
{ // do create key and save value, first time only.
Windows.Storage.ApplicationData.Current.LocalSettings.CreateContainer(key, ApplicationDataCreateDisposition.Always);
if (Windows.Storage.ApplicationData.Current.LocalSettings.Values[key] == null)
{
Windows.Storage.ApplicationData.Current.LocalSettings.Values[key] = value;
}
using (StreamWriter writer = new StreamWriter(stream))
{
List<SquareViewModel> s = new List<SquareViewModel>();
foreach (SquareViewModel item in GameArray)
s.Add(item);
XmlSerializer serializer = new XmlSerializer(s.GetType());
serializer.Serialize(writer, s);
}
}
}