using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Runtime.Serialization; using System.Threading.Tasks; using Windows.Storage; using Xamarin.Forms.Internals; #if WINDOWS_UWP namespace Xamarin.Forms.Platform.UWP #else namespace Xamarin.Forms.Platform.WinRT #endif { internal sealed class WindowsSerializer : IDeserializer { const string PropertyStoreFile = "PropertyStore.forms"; public async Task> DeserializePropertiesAsync() { try { StorageFile file = await ApplicationData.Current.RoamingFolder.GetFileAsync(PropertyStoreFile).DontSync(); using (Stream stream = (await file.OpenReadAsync().DontSync()).AsStreamForRead()) { if (stream.Length == 0) return new Dictionary(4); var serializer = new DataContractSerializer(typeof(IDictionary)); return (IDictionary)serializer.ReadObject(stream); } } catch (FileNotFoundException) { return new Dictionary(4); } } public async Task SerializePropertiesAsync(IDictionary properties) { StorageFile file = await ApplicationData.Current.RoamingFolder.CreateFileAsync(PropertyStoreFile, CreationCollisionOption.ReplaceExisting).DontSync(); using (StorageStreamTransaction transaction = await file.OpenTransactedWriteAsync().DontSync()) { try { Stream stream = transaction.Stream.AsStream(); var serializer = new DataContractSerializer(typeof(IDictionary)); serializer.WriteObject(stream, properties); await transaction.CommitAsync().DontSync(); } catch (Exception e) { Debug.WriteLine("Could not move new serialized property file over old: " + e.Message); } } } } }