def _deserialize_task(self, workflow, s_state):
        assert isinstance(workflow, Workflow)
        # task_spec
        task_spec = workflow.get_task_spec_from_name(s_state['task_spec'])
        if task_spec.name == "Root":  # Don't create two roots
            task = workflow.task_tree
        else:
            task = Task(workflow, task_spec)

        # id
        task.id = s_state['id']

        # parent
        task.parent = workflow.get_task(s_state['parent'])
        # We need to add children in before deserializing child tasks so they can
        # find their parent (Task.Iter uses children to traverse the hierarchy
        if task.parent and task not in task.parent.children:
            task.parent.children.append(task)
        assert task.parent is not None or task.get_name() == 'Root'

        # children
        for c in s_state['children']:
            self._deserialize_task(workflow, c)

        # state
        task._state = s_state['state']

        # last_state_change
        task.last_state_change = s_state['last_state_change']

        # attributes
        task.attributes = s_state['attributes']

        # internal_attributes
        task.internal_attributes = s_state['internal_attributes']

        return task
    def _deserialize_task(self, workflow, s_state):
        assert isinstance(workflow, Workflow)
        # task_spec
        task_spec = workflow.get_task_spec_from_name(s_state['task_spec'])
        if task_spec.name == "Root":  # Don't create two roots
            task = workflow.task_tree
        else:
            task = Task(workflow, task_spec)

        # id
        task.id = s_state['id']

        # parent
        task.parent = workflow.get_task(s_state['parent'])
        # We need to add children in before deserializing child tasks so they can
        # find their parent (Task.Iter uses children to traverse the hierarchy
        if task.parent and task not in task.parent.children:
            task.parent.children.append(task)
        assert task.parent is not None or task.get_name() == 'Root'

        # children
        for c in s_state['children']:
            self._deserialize_task(workflow, c)

        # state
        task._state = s_state['state']

        # last_state_change
        task.last_state_change = s_state['last_state_change']

        # attributes
        task.attributes = s_state['attributes']

        # internal_attributes
        task.internal_attributes = s_state['internal_attributes']

        return task