private void whenImport()
    {
        int row = 1, col = 1;
        int length = GetInt(row++, col);

        paramlist.Clear();
        for (int i = 0; i < length; i++)
        {
            FixClassCircle.ParamMore paramData = new FixClassCircle.ParamMore();
            paramData.desc = GetString(row, col++);
            int leng = GetInt(row, col++);
            for (int j = 0; j < leng; j++)
            {
                FixClassCircle.UseParam useParam = new FixClassCircle.UseParam();
                useParam.NameCh   = GetString(row, col++);
                useParam.NameEng  = GetString(row, col++);
                useParam.type     = (FixClassCircle.ParamType)GetInt(row, col++);
                useParam.EnumDesc = GetString(row, col++);
                paramData.Detail.Add(useParam);
            }
            paramlist.Add(paramData);
            row++;
            col = 1;
        }
        length = GetInt(row++, col);
        serializedNodes.Clear();
        for (int i = 0; i < length; i++)
        {
            FixClassCircle.SerializableNode seriNode = new FixClassCircle.SerializableNode();
            seriNode.tagCh      = GetString(row, col++);
            seriNode.tag        = GetString(row, col++);
            seriNode.paramIndex = GetInt(row, col++);
            int leng = GetInt(row, col++);
            for (int j = 0; j < leng; j++)
            {
                seriNode.otherParamValues.Add(GetString(row, col++));
            }
            seriNode.childCount        = GetInt(row, col++);
            seriNode.indexOfFirstChild = GetInt(row, col++);
            serializedNodes.Add(seriNode);
            row++;
            col = 1;
        }
        OnAfterDeserialize();
    }
 public void OnBeforeSerialize()
 {
     if (CanNot_OnBeforeSerialize)
     {
         return;
     }
     if (CanNot_OnBeforeSerialize_2)
     {
         return;
     }
     CanNot_OnBeforeSerialize_2 = true;
     //unity is about to read the serializedNodes field's contents. lets make sure
     //we write out the correct data into that field "just in time".
     serializedNodes.Clear();
     FixClassCircle.SerializableNode seriRoot = formSeriNode(root);
     serializedNodes.Add(seriRoot);
     letChildBeSerilize(root, seriRoot);
 }
    private void letChildBeSerilize(Node fatherNode, FixClassCircle.SerializableNode fatherSerialNode)
    {
        List <FixClassCircle.SerializableNode> seriListTmp = new List <FixClassCircle.SerializableNode>();

        for (int i = 0; i < fatherNode.children.Count; i++)
        {
            if (i == 0 && fatherSerialNode != null)
            {
                fatherSerialNode.indexOfFirstChild = serializedNodes.Count;
            }
            FixClassCircle.SerializableNode seriTmp = formSeriNode(fatherNode.children[i]);
            serializedNodes.Add(seriTmp);
            seriListTmp.Add(seriTmp);
        }
        for (int i = 0; fatherNode.children != null && i < fatherNode.children.Count && i < seriListTmp.Count; i++)
        {
            letChildBeSerilize(fatherNode.children[i], seriListTmp[i]);
        }
    }
    private FixClassCircle.SerializableNode formSeriNode(Node n)
    {
        //In case of array out of range
        for (int i = paramlist.Count - 1; i < n.paramIndex; i++)
        {
            paramlist.Add(new FixClassCircle.ParamMore());
        }

        var serializedNode = new FixClassCircle.SerializableNode()
        {
            tag        = n.tag,
            tagCh      = n.tagCh,
            childCount = n.children.Count,
            paramIndex = n.paramIndex
        };

        n.ResizeParams();
        foreach (string str in n.otherParamValues)
        {
            serializedNode.otherParamValues.Add(str);
        }
        return(serializedNode);
    }