Exemplo n.º 1
0
        public static async void Save(string name, ObjectPersisterLocation location, object obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }

            StorageFolder folder = null;

            switch (location)
            {
            case ObjectPersisterLocation.Local:
                folder = ApplicationData.Current.LocalFolder;
                break;

            case ObjectPersisterLocation.Roaming:
                folder = ApplicationData.Current.RoamingFolder;
                break;

            case ObjectPersisterLocation.Temp:
                folder = ApplicationData.Current.TemporaryFolder;
                break;
            }

            var types = new Dictionary <Type, Type>();

            AddTypes(obj, types);
            var typeList = new List <string>();

            foreach (var type in types.Keys)
            {
                typeList.Add(type.FullName);
            }

            var metaFile = await folder.CreateFileAsync(name + ".meta", CreationCollisionOption.ReplaceExisting);

            using (var stream = await metaFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                var serializer = new DataContractSerializer(typeof(List <string>));
                serializer.WriteObject(stream.AsStreamForWrite(), typeList);
                await stream.FlushAsync();
            }

            var file = await folder.CreateFileAsync(name, CreationCollisionOption.ReplaceExisting);

            using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var settings = new DataContractSerializerSettings();
                settings.PreserveObjectReferences = true;
                settings.KnownTypes = types.Keys;
                var serializer = new DataContractSerializer(obj.GetType(), settings);
                serializer.WriteObject(stream.AsStreamForWrite(), obj);
                await stream.FlushAsync();
            }
        }
Exemplo n.º 2
0
        public static async Task <T> Load <T>(string name, ObjectPersisterLocation location)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }

            StorageFolder folder = null;

            switch (location)
            {
            case ObjectPersisterLocation.Local:
                folder = ApplicationData.Current.LocalFolder;
                break;

            case ObjectPersisterLocation.Roaming:
                folder = ApplicationData.Current.RoamingFolder;
                break;

            case ObjectPersisterLocation.Temp:
                folder = ApplicationData.Current.TemporaryFolder;
                break;
            }

            List <string> typeList;

            try
            {
                var metaFile = await folder.GetFileAsync(name + ".meta");

                using (var stream = await metaFile.OpenReadAsync())
                {
                    var serializer = new DataContractSerializer(typeof(List <String>));
                    typeList = (List <String>)(serializer.ReadObject(stream.AsStreamForRead()));
                }

                var file = await folder.GetFileAsync(name);

                using (var stream = await file.OpenReadAsync())
                {
                    var settings = new DataContractSerializerSettings();
                    settings.PreserveObjectReferences = true;
                    var types = new List <Type>();
                    foreach (var typeName in typeList)
                    {
                        types.Add(Type.GetType(typeName));
                    }
                    settings.KnownTypes = types;
                    var serializer = new DataContractSerializer(typeof(T), settings);
                    return((T)(serializer.ReadObject(stream.AsStreamForRead())));
                }
            }
            catch (FileNotFoundException)
            {
                return(default(T));
            }
        }