// 重新编译配置Convert表
        public static void BuildConfigConvert()
        {
            ClearConvertMaps();
            // 清理掉所以定义
            ConfigStringKey.ClearPropsMap();

            Assembly asm = Assembly.GetExecutingAssembly();

            System.Type[] types = asm.GetTypes();
            if (types == null || types.Length <= 0)
            {
                return;
            }


            for (int i = 0; i < types.Length; ++i)
            {
                System.Type t = types[i];
                if (BuildConfigConvertClass(t))
                {
                    // 再找这个类里面的field字段是否有标记位
                    // BuildConfigConvertFields(t);
                }
            }
        }
Beispiel #2
0
        // 首次读取
        public static Dictionary <K, V> ToObject <K, V>(Stream stream, bool isLoadAll            = false,
                                                        UnityEngine.MonoBehaviour loadAllCortine = null, Action <float> onProcess = null, int maxAsynReadCnt = 500) where V : ConfigBase <K>, new()
        {
            if (stream == null)
            {
                return(null);
            }
            ConfigFileHeader header = new ConfigFileHeader();

            if (!header.LoadFromStream(stream) || !header.IsVaild)
            {
                return(null);
            }

            // 读取索引
            stream.Seek(header.indexOffset, SeekOrigin.Begin);

            ConfigValueType valueType = (ConfigValueType)stream.ReadByte();

            if (valueType != ConfigValueType.cvObject)
            {
                return(null);
            }

            Dictionary <K, V> maps = null;

            for (uint i = 0; i < header.Count; ++i)
            {
                V config = new V();
                config.stream = stream;
                K key = config.ReadKey();
                config.dataOffset = FilePathMgr.Instance.ReadLong(stream);
                if (maps == null)
                {
                    maps = new Dictionary <K, V>((int)header.Count);
                }
                maps[key] = config;
            }

            if (isLoadAll && maps != null && maps.Count > 0)
            {
                StartLoadAllCortine(maps, loadAllCortine, valueType, onProcess, maxAsynReadCnt);
                if (loadAllCortine == null)
                {
                    stream.Close();
                    stream.Dispose();
                    ConfigStringKey.ClearPropertys(typeof(V));
                }
            }

            return(maps);
        }
Beispiel #3
0
        // 测试用
#if UNITY_EDITOR
        // 通用转换
        // 可以使用List<ConfigBase>或者ConfigBase
        public static Dictionary <K, V> TestCommonToObject <K, V>(byte[] buffer,
                                                                  bool isLoadAll = false,
                                                                  UnityEngine.MonoBehaviour loadAllCortine = null) where V : class, new()
        {
            MemoryStream      stream = new MemoryStream(buffer);
            Dictionary <K, V> ret    = TestCommonToObject <K, V>(stream, isLoadAll, loadAllCortine);

            if (ret == null)
            {
                stream.Close();
                stream.Dispose();
                ConfigStringKey.ClearPropertys(typeof(V));
            }

            return(ret);
        }
Beispiel #4
0
        public static IDictionary TestCommonToObject(byte[] buffer, System.Type configType,
                                                     System.Type dictType, bool isLoadAll     = false,
                                                     UnityEngine.MonoBehaviour loadAllCortine = null)
        {
            if (buffer == null || buffer.Length <= 0 || configType == null || dictType == null)
            {
                return(null);
            }
            MemoryStream stream = new MemoryStream(buffer);
            IDictionary  ret    = TestCommonToObject(stream, configType, dictType, isLoadAll,
                                                     loadAllCortine);

            if (ret == null)
            {
                stream.Close();
                stream.Dispose();
                ConfigStringKey.ClearPropertys(configType);
            }
            return(ret);
        }
Beispiel #5
0
        public static Dictionary <K, V> ToObject <K, V>(byte[] buffer, bool isLoadAll = false) where V : ConfigBase <K>, new()
        {
            Dictionary <K, V> ret = null;

            if (buffer == null || buffer.Length <= 0)
            {
                return(ret);
            }

            MemoryStream stream = new MemoryStream(buffer);

            ret = ToObject <K, V>(stream, isLoadAll);
            if (ret == null)
            {
                stream.Close();
                stream.Dispose();
                ConfigStringKey.ClearPropertys(typeof(V));
            }

            return(ret);
        }
Beispiel #6
0
        public static Dictionary <K1, Dictionary <K2, V> > ToObjectMap <K1, K2, V>(byte[] buffer, bool isLoadAll            = false,
                                                                                   UnityEngine.MonoBehaviour loadAllCortine = null)
            where V : ConfigBase <K2>, new()
        {
            Dictionary <K1, Dictionary <K2, V> > ret = null;

            if (buffer == null || buffer.Length <= 0)
            {
                return(ret);
            }
            MemoryStream stream = new MemoryStream(buffer);

            ret = ToObjectMap <K1, K2, V>(stream, isLoadAll, loadAllCortine);
            if (ret == null)
            {
                stream.Close();
                stream.Dispose();
                ConfigStringKey.ClearPropertys(typeof(V));
            }

            return(ret);
        }
Beispiel #7
0
        private static IEnumerator _ToObjectMapAsync <K1, K2, V>(Stream stream,
                                                                 Dictionary <K1, Dictionary <K2, V> > maps, bool isLoadAll = false,
                                                                 Action <IDictionary> onOK = null, Action <float> onProcess = null, int maxAsyncReadCnt = 500) where V : ConfigBase <K2>, new()
        {
            if (stream == null || maps == null)
            {
                yield break;
            }

            ConfigFileHeader header = new ConfigFileHeader();

            if (!header.LoadFromStream(stream) || !header.IsVaild)
            {
                yield break;
            }

            maps.Clear();

            // 读取索引
            stream.Seek(header.indexOffset, SeekOrigin.Begin);

            ConfigValueType valueType = (ConfigValueType)stream.ReadByte();

            if (valueType != ConfigValueType.cvMap)
            {
                yield break;
            }

            int curCnt = 0;

            System.Type keyType1 = typeof(K1);
            //   System.Type keyType2 = typeof(K2);
            //    System.Type subDictType = typeof(Dictionary<K2, V>);
            for (uint i = 0; i < header.Count; ++i)
            {
                System.Object key1       = FilePathMgr.Instance.ReadObject(stream, keyType1);
                long          dataOffset = FilePathMgr.Instance.ReadLong(stream);
                int           DictCnt    = FilePathMgr.Instance.ReadInt(stream);
                if (DictCnt > 0)
                {
                    Dictionary <K2, V> subMap = new Dictionary <K2, V>();
                    for (int j = 0; j < DictCnt; ++j)
                    {
                        V config = new V();
                        config.stream     = stream;
                        config.dataOffset = dataOffset;
                        K2 key2 = config.ReadKey();
                        subMap[(K2)key2] = config;

                        ++curCnt;
                        if (curCnt >= maxAsyncReadCnt)
                        {
                            curCnt = 0;
                            InitEndFrame();
                            yield return(m_EndFrame);
                        }
                    }


                    if (subMap != null && subMap.Count > 0)
                    {
                        maps[((K1)key1)] = subMap;
                    }
                }
            }

            if (isLoadAll && maps.Count > 0)
            {
                yield return(StartLoadCortine(maps, valueType, onProcess, maxAsyncReadCnt));

                stream.Close();
                stream.Dispose();
                ConfigStringKey.ClearPropertys(typeof(V));
            }

            if (onOK != null)
            {
                onOK(maps);
            }
        }
Beispiel #8
0
        private static IEnumerator _ToObjectListAsync <K, V>(Stream stream,
                                                             Dictionary <K, List <V> > maps, bool isLoadAll = false,
                                                             Action <IDictionary> onOK = null, Action <float> onProcess = null, int maxAsyncReadCnt = 500) where V : ConfigBase <K>, new()
        {
            if (stream == null || maps == null)
            {
                yield break;
            }

            maps.Clear();

            ConfigFileHeader header = new ConfigFileHeader();

            if (!header.LoadFromStream(stream) || !header.IsVaild)
            {
                yield break;
            }

            // 读取索引
            stream.Seek(header.indexOffset, SeekOrigin.Begin);

            ConfigValueType valueType = (ConfigValueType)stream.ReadByte();

            if (valueType != ConfigValueType.cvList)
            {
                yield break;
            }

            int curCnt = 0;

            for (uint i = 0; i < header.Count; ++i)
            {
                V config = new V();
                config.stream = stream;
                K    key        = config.ReadKey();
                long dataOffset = FilePathMgr.Instance.ReadLong(stream);
                config.dataOffset = dataOffset;
                int listCnt = FilePathMgr.Instance.ReadInt(stream);
                if (maps == null)
                {
                    maps = new Dictionary <K, List <V> >((int)header.Count);
                }
                List <V> vs = new List <V>(listCnt);
                maps[key] = vs;
                vs.Add(config);
                for (int j = 1; j < listCnt; ++j)
                {
                    config            = new V();
                    config.stream     = stream;
                    config.dataOffset = dataOffset;
                    vs.Add(config);

                    ++curCnt;
                    if (curCnt >= maxAsyncReadCnt)
                    {
                        curCnt = 0;
                        InitEndFrame();
                        yield return(m_EndFrame);
                    }
                }

                if (onProcess != null)
                {
                    float delta   = isLoadAll ? 0.5f : 1f;
                    float process = ((float)i / (float)header.Count) * delta;
                    onProcess(process);
                }
            }

            if (isLoadAll && maps.Count > 0)
            {
                yield return(StartLoadCortine(maps, valueType, onProcess, maxAsyncReadCnt));

                stream.Close();
                stream.Dispose();
                ConfigStringKey.ClearPropertys(typeof(V));
            }

            if (onOK != null)
            {
                onOK(maps);
            }
        }
Beispiel #9
0
        public static Dictionary <K, V> TestCommonToObject <K, V>(Stream stream,
                                                                  bool isLoadAll = false,
                                                                  UnityEngine.MonoBehaviour loadAllCortine = null,
                                                                  int maxAsyncReadCnt = 500) where V : class, new()
        {
            if (stream == null)
            {
                return(null);
            }

            ConfigFileHeader header = new ConfigFileHeader();

            if (!header.LoadFromStream(stream) || !header.IsVaild)
            {
                return(null);
            }

            // 读取索引
            stream.Seek(header.indexOffset, SeekOrigin.Begin);
            // 读取类型(之前已经获取到了)
            ConfigValueType valueType = (ConfigValueType)stream.ReadByte();

            Dictionary <K, V> maps = null;

            switch (valueType)
            {
            case ConfigValueType.cvObject: {
                for (uint i = 0; i < header.Count; ++i)
                {
                    ConfigBase <K> config = new V() as ConfigBase <K>;
                    config.stream = stream;
                    K key = config.ReadKey();
                    config.dataOffset = FilePathMgr.Instance.ReadLong(stream);
                    if (maps == null)
                    {
                        maps = new Dictionary <K, V>((int)header.Count);
                    }
                    maps[key] = config as V;
                }
                break;
            }

            case ConfigValueType.cvList: {
                System.Type t = typeof(V);
                // 这里有数组分配,不要频繁使用TestCommonToObject
                var interfaces = t.GetInterfaces();
                if (interfaces == null || interfaces.Length <= 0)
                {
                    return(null);
                }
                var inter = interfaces[0];
                if (inter == null)
                {
                    return(null);
                }
                for (uint i = 0; i < header.Count; ++i)
                {
                    ConfigBase <K> config = Activator.CreateInstance(inter) as ConfigBase <K>;
                    config.stream = stream;
                    K    key        = config.ReadKey();
                    long dataOffset = FilePathMgr.Instance.ReadLong(stream);
                    config.dataOffset = dataOffset;
                    int listCnt = FilePathMgr.Instance.ReadInt(stream);
                    if (maps == null)
                    {
                        maps = new Dictionary <K, V>((int)header.Count);
                    }
                    V vs = new V();
                    maps[key] = vs;
                    IList list = vs as IList;
                    list.Add(config);
                    for (int j = 1; j < listCnt; ++j)
                    {
                        config            = Activator.CreateInstance(inter) as ConfigBase <K>;
                        config.stream     = stream;
                        config.dataOffset = dataOffset;
                        list.Add(config);
                    }
                }
                break;
            }

            default:
                return(null);
            }

            if (isLoadAll && maps != null && maps.Count > 0)
            {
                StartLoadAllCortine(maps, loadAllCortine, valueType, null, maxAsyncReadCnt);
                if (loadAllCortine == null)
                {
                    stream.Close();
                    stream.Dispose();
                    ConfigStringKey.ClearPropertys(typeof(V));
                }
            }

            return(maps);
        }
Beispiel #10
0
        public static IDictionary TestCommonToObject(Stream stream, System.Type configType,
                                                     System.Type dictType, bool isLoadAll     = false,
                                                     UnityEngine.MonoBehaviour loadAllCortine = null, int maxAsyncReadCnt = 500)
        {
            if (stream == null || configType == null || dictType == null)
            {
                return(null);
            }

            ConfigFileHeader header = new ConfigFileHeader();

            if (!header.LoadFromStream(stream) || !header.IsVaild)
            {
                return(null);
            }

            // 读取索引
            stream.Seek(header.indexOffset, SeekOrigin.Begin);
            // 读取类型(之前已经获取到了)
            ConfigValueType valueType = (ConfigValueType)stream.ReadByte();

            IDictionary maps = null;

            switch (valueType)
            {
            case ConfigValueType.cvObject: {
                for (uint i = 0; i < header.Count; ++i)
                {
                    IConfigBase config = Activator.CreateInstance(configType) as IConfigBase;
                    config.stream = stream;
                    System.Object key = config.ReadKEY();
                    config.dataOffset = FilePathMgr.Instance.ReadLong(stream);
                    if (maps == null)
                    {
                        maps = Activator.CreateInstance(dictType) as IDictionary;
                    }
                    maps[key] = config;
                }
                break;
            }

            case ConfigValueType.cvList: {
                var vsType = typeof(List <>).MakeGenericType(configType);
                for (uint i = 0; i < header.Count; ++i)
                {
                    IConfigBase config = Activator.CreateInstance(configType) as IConfigBase;
                    config.stream = stream;
                    System.Object key        = config.ReadKEY();
                    long          dataOffset = FilePathMgr.Instance.ReadLong(stream);
                    config.dataOffset = dataOffset;
                    int listCnt = FilePathMgr.Instance.ReadInt(stream);
                    if (maps == null)
                    {
                        maps = Activator.CreateInstance(dictType) as IDictionary;
                    }
                    IList list = Activator.CreateInstance(vsType) as IList;
                    maps[key] = list;
                    list.Add(config);
                    for (int j = 1; j < listCnt; ++j)
                    {
                        config            = Activator.CreateInstance(configType) as IConfigBase;
                        config.stream     = stream;
                        config.dataOffset = dataOffset;
                        list.Add(config);
                    }
                }
                break;
            }

            // 有问题
            case ConfigValueType.cvMap: {
                Type[] vTypes = dictType.GetInterfaces();
                if (vTypes == null || vTypes.Length < 2)
                {
                    return(null);
                }
                Type k1 = vTypes[0];
                if (k1 == null)
                {
                    return(null);
                }

                Type vType = vTypes[1];
                if (vType == null)
                {
                    return(null);
                }

                if (!vType.IsSubclassOf(typeof(IDictionary)))
                {
                    return(null);
                }

                Type[] subTypes = vType.GetInterfaces();
                if (subTypes == null || subTypes.Length < 2)
                {
                    return(null);
                }

                Type k2 = subTypes[0];
                Type v  = subTypes[1];
                if (k2 == null || v == null)
                {
                    return(null);
                }

                var subDictType = typeof(Dictionary <System.Object, System.Object>).MakeGenericType(k2, v);
                if (subDictType == null)
                {
                    return(null);
                }

                for (uint i = 0; i < header.Count; ++i)
                {
                }

                break;
            }

            default:
                return(null);
            }

            if (isLoadAll && maps != null && maps.Count > 0)
            {
                StartLoadAllCortine(maps, loadAllCortine, valueType, null, maxAsyncReadCnt);
                if (loadAllCortine == null)
                {
                    stream.Close();
                    stream.Dispose();
                    ConfigStringKey.ClearPropertys(configType);
                }
            }

            return(maps);
        }
Beispiel #11
0
        // 转换成字典类型
        public static Dictionary <K1, Dictionary <K2, V> > ToObjectMap <K1, K2, V>(Stream stream, bool isLoadAll            = false,
                                                                                   UnityEngine.MonoBehaviour loadAllCortine = null,
                                                                                   Action <float> onProcess = null, int maxAsyncReadCnt = 500)
            where V : ConfigBase <K2>, new()
        {
            if (stream == null)
            {
                return(null);
            }
            ConfigFileHeader header = new ConfigFileHeader();

            if (!header.LoadFromStream(stream) || !header.IsVaild)
            {
                return(null);
            }

            // 读取索引
            stream.Seek(header.indexOffset, SeekOrigin.Begin);

            ConfigValueType valueType = (ConfigValueType)stream.ReadByte();

            if (valueType != ConfigValueType.cvMap)
            {
                return(null);
            }

            Dictionary <K1, Dictionary <K2, V> > maps = null;

            System.Type keyType1 = typeof(K1);
            //  System.Type keyType2 = typeof(K2);
            //   System.Type subDictType = typeof(Dictionary<K2, V>);
            for (uint i = 0; i < header.Count; ++i)
            {
                System.Object key1       = FilePathMgr.Instance.ReadObject(stream, keyType1);
                long          dataOffset = FilePathMgr.Instance.ReadLong(stream);
                int           DictCnt    = FilePathMgr.Instance.ReadInt(stream);
                if (DictCnt > 0)
                {
                    if (maps == null)
                    {
                        maps = new Dictionary <K1, Dictionary <K2, V> >();
                    }

                    Dictionary <K2, V> subMap = new Dictionary <K2, V>();
                    for (int j = 0; j < DictCnt; ++j)
                    {
                        V config = new V();
                        config.stream     = stream;
                        config.dataOffset = dataOffset;
                        K2 key2 = config.ReadKey();
                        subMap[(K2)key2] = config;
                    }


                    if (subMap != null && subMap.Count > 0)
                    {
                        maps[((K1)key1)] = subMap;
                    }
                }
            }

            if (isLoadAll && maps != null && maps.Count > 0)
            {
                StartLoadAllCortine(maps, loadAllCortine, valueType, onProcess, maxAsyncReadCnt);
                if (loadAllCortine == null)
                {
                    stream.Close();
                    stream.Dispose();
                    ConfigStringKey.ClearPropertys(typeof(V));
                }
            }

            return(maps);
        }