public static SuoDataJson Serialize(ToolWindowViewModel vm)
        {
            if (vm == null)
            {
                throw new ArgumentNullException(nameof(vm));
            }

            var data = new SuoDataJson();

            data.ShowAllProjects   = vm.TreeViewModel.ShowAllProjects;
            data.CheckedArguments  = new HashSet <Guid>(vm.TreeViewModel.AllProjects.SelectMany(p => p.CheckedArguments).Select(arg => arg.Id));
            data.ExpandedContainer = new HashSet <Guid>(vm.TreeViewModel.AllItems.OfType <CmdContainer>().Where(con => con.IsExpanded).Select(p => p.Id));

            data.SelectedItems = new HashSet <Guid>(vm.TreeViewModel.Projects.Values.SelectMany(p => p.SelectedItems).Select(item => item.Id)
                                                    .Concat(vm.TreeViewModel.Projects.Values.Where(p => p.IsSelected).Select(p => p.Id)));

            foreach (var kvPair in vm.TreeViewModel.Projects)
            {
                var list = new ProjectDataJsonVersioned
                {
                    Id            = kvPair.Value.Id,
                    ExclusiveMode = kvPair.Value.ExclusiveMode,
                    Delimiter     = kvPair.Value.Delimiter,
                    Items         = TransformCmdList(kvPair.Value.Items),

                    // not in JSON
                    Expanded = kvPair.Value.IsExpanded,
                    Selected = kvPair.Value.IsSelected,
                };
                data.ProjectArguments.Add(kvPair.Key, list);
            }

            return(data);
        }
        private static SuoDataJson ParseOldJsonFormat(JObject obj, VisualStudioHelper vsHelper)
        {
            var result = new SuoDataJson();

            foreach (var prop in obj.Properties())
            {
                var projectState = ProjectDataSerializer.ParseOldJsonFormat(prop.Value);

                var projectName  = prop.Name;
                var projectGuid  = vsHelper.ProjectGuidForProjetName(projectName);
                var enabledItems = from item in projectState.Items
                                   where item.Enabled
                                   select item.Id;

                result.ProjectArguments.Add(projectGuid, projectState);
                result.CheckedArguments.AddRange(enabledItems);
            }

            return(result);
        }