Exemplo n.º 1
0
        /// <summary>
        /// 编译一系列声明
        /// </summary>
        /// <param name="array">
        /// 需要编译的声明列表,
        /// <see cref="PackageDeclaration"/>应该为首元素(如果有),
        /// <see cref="UsingDeclaration"/>和<see cref="UsingAsDeclaration"/>应该在所有结构声明之前
        /// </param>
        /// <returns>编译结果,Key:类型FullName,Value:类型元数据对象</returns>
        public IReadOnlyDictionary <string, AccelTypeInfo> Compile(DeclarationArray array)
        {
            IDeclaration[] declarations = array.Declarations;

            if (declarations == null)
            {
                return(null);
            }

            Dictionary <string, AccelTypeInfo> result = new Dictionary <string, AccelTypeInfo>();

            m_ImportedPackages.Clear();
            m_TypeAlias.Clear();

            string packageName = string.Empty;

            for (int i = 0; i < declarations.Length; i++)
            {
                IDeclaration declaration = declarations[i];

                switch (declaration)
                {
                case PackageDeclaration packageDeclaration:
                    packageName = packageDeclaration.PackageName;
                    m_ImportedPackages.Add(packageDeclaration.PackageName);
                    break;

                case UsingDeclaration usingDeclaration:
                    m_ImportedPackages.Add(usingDeclaration.PackageName);
                    break;

                case UsingAsDeclaration usingAsDeclaration:
                    m_TypeAlias.Add(usingAsDeclaration.AliasName, GetType(usingAsDeclaration.TypeName));
                    break;

                case StructDeclaration structDeclaration:
                    DefineType(packageName, null, null, structDeclaration, result);
                    break;

                default:
                    continue;
                }
            }

            foreach (AccelTypeInfo typeInfo in result.Values)
            {
                Type type           = typeInfo.Info;
                Type serializerType = SerializerInjector.Inject(type, typeInfo);
                SerializerBinder.AddBinding(type, serializerType);

                DefineDynamicSerializeFunction(typeInfo);
                DefineDynamicDeserializeFunction(typeInfo);
            }

            return(result);
        }
Exemplo n.º 2
0
        static InternalTypeCache()
        {
            Serializer = SerializerInjector.Inject <T>();

            ApproximateMemorySize = 160;//设置默认值

            if (Serializer is IMemorySizeForType <T> memSize && memSize.ApproximateMemorySize > 0)
            {
                ApproximateMemorySize = memSize.ApproximateMemorySize + 5;//tag max len
            }
            else
            {
                MemorySizeAttribute attr = typeof(T).GetCustomAttribute <MemorySizeAttribute>(true);

                if (attr != null && attr.ApproximateMemorySize > 0)
                {
                    ApproximateMemorySize = attr.ApproximateMemorySize + 5;//tag max len
                }
            }
        }