public async Task <bool> SaveAsync(T objectGraph) { if (Equals(objectGraph, null)) { return(false); } //create a seperate file to write to //so if we crash in the middle of this, we should not have corrupted the original file IFile file = await _folder.CreateFileAsync(_filename, CreationCollisionOption.GenerateUniqueName); bool createdUniqueFile = file.Name != _filename; _logger.DebugEx("Created file " + file.Name); //TODOlater file add optional transacted writes to PCLStorage using (var stream = await file.OpenAsync(FileAccess.ReadAndWrite)) { await _serializer.SerializeAsync(stream, objectGraph); } /* * using (StorageStreamTransaction streamTx = await file.OpenTransactedWriteAsync()) * { * using (Stream outStream = streamTx.Stream.AsStreamForWrite()) * { * await _serializer.SerializeAsync(outStream, objectGraph); * } * await streamTx.CommitAsync(); * } */ if (createdUniqueFile) { //rename files IFile existingFile = await _folder.CreateFileAsync(_filename, CreationCollisionOption.OpenIfExists); _logger.DebugEx("Created or opened file: " + _filename); _logger.DebugEx("Moving file " + existingFile.Name + ", to backup "); await existingFile.MoveAsync( PortablePath.Combine(_folder.Path, GetBackupFileName(_filename)), NameCollisionOption.ReplaceExisting); _logger.DebugEx("Moving file " + file.Name + ", to " + _filename); await file.MoveAsync( PortablePath.Combine(_folder.Path, _filename), NameCollisionOption.ReplaceExisting); } return(true); }