private static void ClassToXml(string name)
    {
        if (string.IsNullOrEmpty(name))
        {
            return;
        }
        Type _type = null;

        foreach (var temp in AppDomain.CurrentDomain.GetAssemblies())
        {
            Type tempType = temp.GetType(name);
            if (tempType != null)
            {
                _type = tempType;
                break;
            }
        }

        if (_type != null)
        {
            var ints = Activator.CreateInstance(_type);
            if (ints is ConfigDataBase)
            {
                (ints as ConfigDataBase).Construct();
            }
            GameDataConvert.ClassToXml(ints);
        }
    }
Exemple #2
0
    /// <summary>
    /// 加载二进制配置
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="path">二进制文件路径</param>
    /// <returns></returns>
    public T LoadBinaryConfigData <T>(string binaryPath) where T : ConfigDataBase
    {
        if (string.IsNullOrEmpty(binaryPath))
        {
            Debug.Log("二进制文件路径为空");
            return(default(T));
        }
        if (m_configDataDic.ContainsKey(binaryPath))
        {
            return((T)m_configDataDic[binaryPath]);
        }

        ConfigDataBase data = GameDataConvert.BinaryDeserialize <T>(binaryPath);

#if UNITY_EDITOR
        if (data == null)
        {
            Debug.Log("二进制文件加载失败,尝试加载xml");
            string xmlPath = binaryPath.Replace("Binary", "Xml").Replace(".bytes", ".xml");
            data = GameDataConvert.XmlDeserializeInEditorMode <T>(xmlPath);
        }
#endif
        if (data != null)
        {
            data.Init();

            m_configDataDic.Add(binaryPath, data);

            return(data as T);
        }
        return(default(T));
    }
    /// <summary>
    /// 获取类的实例 (这是有数据的)
    /// </summary>
    /// <param name="className">类名</param>
    /// <returns></returns>
    private static object GetClassObjFromXml(string className)
    {
        Type classType = null;

        foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
        {
            if (asm.GetType(className) != null)
            {
                classType = asm.GetType(className);
                break;
            }
        }
        if (classType != null)
        {
            string xmlPath = PathConfig.GameDataConfigXmlPath + className + ".xml";
            return(GameDataConvert.XmlDeserializeInEditorMode(xmlPath, classType));
        }
        return(null);
    }
    private static void XmlToBinary(string name)
    {
        if (string.IsNullOrEmpty(name))
        {
            return;
        }
        Type _type = null;

        foreach (var item in AppDomain.CurrentDomain.GetAssemblies())
        {
            Type tempType = item.GetType(name);
            if (tempType != null)
            {
                _type = tempType;
                break;
            }
        }
        if (_type != null)
        {
            string xmlPath = PathConfig.GameDataConfigXmlPath + name + ".xml";
            object obj     = GameDataConvert.XmlDeserializeInEditorMode(xmlPath, _type);
            GameDataConvert.BinarySerialize(obj);
        }
    }
    private static void ExcelToXml(string regName)
    {
        string regPath = PathConfig.OuterDataRegPath + regName;

        if (!File.Exists(regPath))
        {
            Debug.LogError("reg文件不存在" + regPath);
            return;
        }

        XmlDocument xmlDoc = new XmlDocument();
        XmlReader   reader = XmlReader.Create(regPath);

        xmlDoc.Load(reader);

        XmlNode    rootNode  = xmlDoc.SelectSingleNode("data");
        XmlElement rootEle   = (XmlElement)rootNode;
        string     className = rootEle.GetAttribute("name");
        string     excelName = rootEle.GetAttribute("from");
        string     xmlName   = rootEle.GetAttribute("to");

        Dictionary <string, SheetClass> nameSheetClassDic = new Dictionary <string, SheetClass>();

        ReadRegXmlNode(rootEle, nameSheetClassDic, 0);

        Dictionary <string, SheetData> _nameSheetDataDic = new Dictionary <string, SheetData>();
        string excelPath = PathConfig.OuterDataExcelPath + excelName;


        //读取excel的数据
        using (FileStream fs = File.Open(excelPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
            using (ExcelPackage package = new ExcelPackage(fs)) {
                ExcelWorksheets sheets = package.Workbook.Worksheets;
                for (int i = 0; i < sheets.Count; i++)
                {
                    //注意从excel读取/写入数据时,下标是从1开始的
                    ExcelWorksheet workSheet = sheets[i + 1];
                    SheetData      _shtData  = new SheetData();
                    SheetClass     _shtClass = nameSheetClassDic[workSheet.Name];
                    int            colCount  = workSheet.Dimension.End.Column;
                    int            rowCount  = workSheet.Dimension.End.Row;

                    for (int m = 0; m < _shtClass.AllVariableList.Count; m++)
                    {
                        //保存变量名和类型
                        _shtData.AllNameList.Add(_shtClass.AllVariableList[m].Name);
                        _shtData.AllTypeList.Add(_shtClass.AllVariableList[m].Type);
                    }

                    //保存每一行的数据,从第三行开始是实际的数据
                    for (int m = 3; m <= rowCount; m++)
                    {
                        RowData _rowData = new RowData();

                        int n = 1;
                        if (_shtClass.ParentVarClass != null && !string.IsNullOrEmpty(_shtClass.ParentVarClass.Foreign))
                        {
                            //如果是子表就从第二列开始读取数据
                            _shtData.IsSubSheet = true;
                            _rowData.ForeignKey = workSheet.Cells[m, 1].Value.ToString().Trim();
                            n = 2;
                        }
                        for (; n <= colCount; n++)
                        {
                            string key   = workSheet.Cells[1, n].Value.ToString().Trim();
                            string value = "";
                            if (workSheet.Cells[m, n].Value != null)
                            {
                                value = workSheet.Cells[m, n].Value.ToString().Trim();
                            }
                            _rowData.OneRowDataDic.Add(key, value);
                        }
                        _shtData.AllRowDataList.Add(_rowData);
                    }

                    _nameSheetDataDic.Add(workSheet.Name, _shtData);
                }
            }
        }

        //写入到类中
        object classObj = CreateClassObjByName(className);

        if (classObj != null)
        {
            //首先获取到外层表的表名
            List <string> outerKeyList = new List <string>();
            foreach (string str in nameSheetClassDic.Keys)
            {
                SheetClass _shtClass = nameSheetClassDic[str];
                if (_shtClass.Depth == 1)
                {
                    outerKeyList.Add(str);
                }
            }
            foreach (string str in outerKeyList)
            {
                WriteToClass(classObj, str, nameSheetClassDic, _nameSheetDataDic, "");
            }

            //xml序列化
            GameDataConvert.ClassToXml(classObj);
            AssetDatabase.Refresh();
        }
    }