internal void Deserialize(XmlTextReader reader, TaskTypes types)
        {
            int depth = reader.Depth;

            // load type
            var typeName = reader.Name;
            TaskTypeCategory category = null;

            foreach (var c in types.TaskTypeCategories)
            {
                category = c;
                TaskType = c.TaskTypes.Find(type => type.TypeName == typeName);
                if (TaskType != null)
                {
                    break;
                }
            }
            if (TaskType == null)
            {
                throw new NotSupportedException("TaskType \"" + typeName + "\" not found.");
            }

            // load parameter values
            ParameterValues = new string[TaskType.Parameters.Count];
            for (int i = 0; i < TaskType.Parameters.Count; i++)
            {
                ParameterValues[i] = reader.GetAttribute(TaskType.Parameters[i].Name);
            }
            Description = reader.GetAttribute("description");

            // load subtasks
            Subtasks = new List <Task>();
            if (category.Name == "Decorators" || category.Name == "ParentTasks")
            {
                while (true)
                {
                    var subtask = new Task(reader, types);
                    if (subtask.TaskType == null)
                    {
                        break;
                    }
                    Subtasks.Add(subtask);
                }
            }

            while (reader.Depth > depth)
            {
                reader.Read();
            }
        }
        internal TaskType(XmlTextReader reader, TaskTypeCategory category)
        {
            Category = category;
            TypeName = reader.Name;
            Name     = TypeName.Substring(TypeName.LastIndexOf('.') + 1);

            if (reader.HasAttributes)
            {
                while (reader.MoveToNextAttribute())
                {
                    if (reader.Name == "_doc_")
                    {
                        Summary = reader.Value;
                    }
                    else
                    {
                        Parameters.Add(new TaskTypeParameter(reader.Name, reader.Value));
                    }
                }
                reader.MoveToElement();
            }
        }