/// <summary> /// /// </summary> /// <param name="stream"></param> /// <param name="project"></param> /// <param name="serializer"></param> public static void Save(Stream stream, Project project, ISerializer serializer) { using (var archive = new ZipArchive(stream, ZipArchiveMode.Create)) { // First step is to write project entry. var jsonEntry = archive.CreateEntry(ProjectEntryName); using (var jsonStream = jsonEntry.Open()) { var json = serializer.Serialize(project); WriteUtf8Text(jsonStream, json); } // Second step is to write (if any) project images. var keys = Editor.GetAllShapes<XImage>(project).Select(i => i.Path).Distinct(); foreach (var key in keys) { var bytes = project.GetImage(key); if (bytes != null) { var imageEntry = archive.CreateEntry(key); using (var imageStream = imageEntry.Open()) { WriteBinary(imageStream, bytes); } } } // NOTE: Purge deleted images from memory is not called here to enable Undo/Redo. //project.PurgeUnusedImages(new HashSet<string>(keys)); } }