Пример #1
0
 /// <summary>
 /// 枚举值解析
 /// </summary>
 /// <param name="jsonDeSerializer">JSON 反序列化</param>
 /// <param name="value">目标数据</param>
 /// <param name="index">第一个枚举索引</param>
 /// <param name="nextIndex">第二个枚举索引</param>
 protected static void getIndex(JsonDeSerializer jsonDeSerializer, ref T value, out int index, ref int nextIndex)
 {
     if ((index = enumSearcher.SearchFlagEnum(jsonDeSerializer)) == -1)
     {
         if (!jsonDeSerializer.Config.IsMatchEnum)
         {
             do
             {
                 if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success || jsonDeSerializer.Quote == 0)
                 {
                     return;
                 }
             }while ((index = enumSearcher.NextFlagEnum(jsonDeSerializer)) == -1);
         }
         else
         {
             jsonDeSerializer.DeSerializeState = DeSerializeState.NoFoundEnumValue;
             return;
         }
     }
     do
     {
         if (jsonDeSerializer.Quote == 0)
         {
             value = enumValues[index];
             return;
         }
         if ((nextIndex = enumSearcher.NextFlagEnum(jsonDeSerializer)) != -1)
         {
             break;
         }
     }while (jsonDeSerializer.DeSerializeState == DeSerializeState.Success);
 }
Пример #2
0
 /// <summary>
 /// 引用类型对象解析
 /// </summary>
 /// <param name="jsonDeSerializer">Json解析器</param>
 /// <param name="value">目标数据</param>
 private static void deSerializeClass(JsonDeSerializer jsonDeSerializer, ref T value)
 {
     if (jsonDeSerializer.SearchObject())
     {
         if (value == null)
         {
             if (AutoCSer.Metadata.DefaultConstructor <T> .Type == DefaultConstructorType.None)
             {
                 jsonDeSerializer.CheckNoConstructor(ref value, isAnonymousType);
                 if (value == null)
                 {
                     return;
                 }
             }
             else
             {
                 value = AutoCSer.Metadata.DefaultConstructor <T> .Constructor();
             }
         }
         else if (isAnonymousType)
         {
             jsonDeSerializer.SetAnonymousType(value);
         }
         DeSerializeMembers(jsonDeSerializer, ref value);
     }
     else
     {
         if (value != null && isAnonymousType)
         {
             jsonDeSerializer.SetAnonymousType(value);
         }
         value = default(T);
     }
 }
Пример #3
0
        public static KeyValue <DeSerializeResult, Node> toJsonNode <T>(this SubString json, DeSerializeConfig config = null)
        {
            KeyValue <DeSerializeResult, Node> value = default(KeyValue <DeSerializeResult, Node>);

            value.Key = JsonDeSerializer.DeSerialize(ref json, ref value.Value, config);
            return(value);
        }
Пример #4
0
 public static void DeSerialize(JsonDeSerializer jsonDeSerializer, ref T value)
 {
     if (!tryDeSerializeNumber(jsonDeSerializer, ref value))
     {
         deSerialize(jsonDeSerializer, ref value);
     }
 }
Пример #5
0
        /// <summary>
        /// 根据枚举字符串查找目标索引
        /// </summary>
        /// <param name="jsonDeSerializer">JSON 解析器</param>
        /// <param name="value">当前字符</param>
        /// <returns>目标索引,null返回-1</returns>
        private int flagEnum(JsonDeSerializer jsonDeSerializer, char value)
        {
            byte *currentState = State;

            do
            {
                char *prefix = (char *)(currentState + *(int *)currentState);
                if (*prefix != 0)
                {
                    if (value != *prefix)
                    {
                        return(-1);
                    }
                    while (*++prefix != 0)
                    {
                        if (jsonDeSerializer.NextEnumChar() != *prefix)
                        {
                            return(-1);
                        }
                    }
                    value = jsonDeSerializer.NextEnumChar();
                }
                if (value == 0 || value == ',')
                {
                    return(jsonDeSerializer.DeSerializeState == DeSerializeState.Success ? *(int *)(currentState + sizeof(int) * 2) : -1);
                }
                if (*(int *)(currentState + sizeof(int)) == 0)
                {
                    return(-1);
                }
                int   index = value < 128 ? (int)*(ushort *)(charsAscii + (value << 1)) : getCharIndex(value);
                byte *table = currentState + *(int *)(currentState + sizeof(int));
                if (tableType == 0)
                {
                    if ((index = *(table + index)) == 0)
                    {
                        return(-1);
                    }
                    currentState = State + index * 3 * sizeof(int);
                }
                else if (tableType == 1)
                {
                    if ((index = (int)*(ushort *)(table + index * sizeof(ushort))) == 0)
                    {
                        return(-1);
                    }
                    currentState = State + index * 3 * sizeof(int);
                }
                else
                {
                    if ((index = *(int *)(table + index * sizeof(int))) == 0)
                    {
                        return(-1);
                    }
                    currentState = State + index;
                }
                value = jsonDeSerializer.NextEnumChar();
            }while (true);
        }
Пример #6
0
        internal static void Array(JsonDeSerializer jsonDeSerializer, ref T[] values)
        {
            int count = ArrayIndex(jsonDeSerializer, ref values);

            if (count >= 0 && count != values.Length)
            {
                System.Array.Resize(ref values, count);
            }
        }
Пример #7
0
 internal static void DeSerializeClass(JsonDeSerializer jsonDeSerializer, ref T value)
 {
     if (DefaultDeSerializer == null)
     {
         deSerializeClass(jsonDeSerializer, ref value);
     }
     else
     {
         DefaultDeSerializer(jsonDeSerializer, ref value);
     }
 }
Пример #8
0
 internal static void DeSerializeValue(JsonDeSerializer jsonDeSerializer, ref T value)
 {
     if (jsonDeSerializer.SearchObject())
     {
         DeSerializeMembers(jsonDeSerializer, ref value);
     }
     else
     {
         value = default(T);
     }
 }
Пример #9
0
 internal static void DeSerializeStruct(JsonDeSerializer jsonDeSerializer, ref T value)
 {
     if (DefaultDeSerializer == null)
     {
         DeSerializeValue(jsonDeSerializer, ref value);
     }
     else
     {
         DefaultDeSerializer(jsonDeSerializer, ref value);
     }
 }
Пример #10
0
        public void TestCatsListOfMaleOwnerWhenThereAreNoCats()
        {
            // Arrange
            string jsonData     = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]}]";
            var    dependencies = GetTestDependencies();

            dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            var result = dependencies.catStrategy.GetPetsOfMaleOwner();

            Assert.AreEqual(0, result.Count);
        }
Пример #11
0
        public void TestCatsListOfMaleOwnerWhenPetsIsNull()
        {
            // Arrange
            string jsonData     = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":null}]";
            var    dependencies = GetTestDependencies();

            dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            var result = dependencies.catStrategy.GetPetsOfMaleOwner();

            Assert.AreEqual(0, result.Count);
        }
Пример #12
0
        public void TestStrategyInstanceForCats()
        {
            // Arrange
            string jsonData     = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]";
            var    dependencies = GetTestDependencies();

            dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);
            var expectedStrategy = new CatsStrategy(dependencies.petService, dependencies.inputData);

            var result = dependencies.petStrategyFactory.Resolve(PetType.Cat);

            Assert.AreEqual(JsonConvert.SerializeObject(expectedStrategy), JsonConvert.SerializeObject(result));
        }
Пример #13
0
        /// <summary>
        /// 获取成员转换函数信息
        /// </summary>
        /// <param name="type">成员类型</param>
        /// <param name="isCustom"></param>
        /// <returns>成员转换函数信息</returns>
        internal static MethodInfo GetMemberMethodInfo(Type type, ref bool isCustom)
        {
            MethodInfo methodInfo = JsonDeSerializer.GetDeSerializeMethod(type);

            if (methodInfo != null)
            {
                return(methodInfo);
            }
            if (type.IsArray)
            {
                return(GenericType.Get(type.GetElementType()).JsonDeSerializeArrayMethod.Method);
            }
            if (type.IsEnum)
            {
                if (type.IsDefined(typeof(FlagsAttribute), false))
                {
                    return((EnumGenericType.Get(type).JsonDeSerializeEnumFlagsDelegate).Method);
                }
                return((EnumGenericType.Get(type).JsonDeSerializeEnumDelegate).Method);
            }
            if (type.IsGenericType)
            {
                Type genericType = type.GetGenericTypeDefinition();
                if (genericType == typeof(Dictionary <,>))
                {
                    return(GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeDictionaryMethod.Method);
                }
                if (genericType == typeof(Nullable <>))
                {
                    return(GetNullable(type).Method);
                }
                if (genericType == typeof(KeyValuePair <,>))
                {
                    return(GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeKeyValuePairMethod.Method);
                }
            }
            if ((methodInfo = GetCustom(type)) != null)
            {
                isCustom = type.IsValueType;
                return(methodInfo);
            }
            if ((methodInfo = GetIEnumerableConstructor(type)) != null)
            {
                return(methodInfo);
            }
            if (type.IsValueType)
            {
                return(StructGenericType.Get(type).JsonDeSerializeStructMethod);
            }
            return(GenericType.Get(type).JsonDeSerializeTypeMethod);
        }
Пример #14
0
        public void TestCatsCountOfMaleOwnerWhenThereIsMoreThanOneCat()
        {
            // Arrange
            string    jsonData  = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]";
            InputData inputData = new InputData();

            inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            IPetService petService = new PetService();

            var result = petService.GetPets(inputData, Gender.Male, PetType.Cat);

            Assert.AreEqual(4, result.Count);
        }
Пример #15
0
 /// <summary>
 /// 数值解析
 /// </summary>
 /// <param name="jsonDeSerializer"></param>
 /// <param name="value"></param>
 /// <returns></returns>
 private static bool tryDeSerializeNumber(JsonDeSerializer jsonDeSerializer, ref T value)
 {
     if (jsonDeSerializer.IsEnumNumberUnsigned())
     {
         ulong intValue = 0;
         jsonDeSerializer.CallSerialize(ref intValue);
         value = AutoCSer.Metadata.EnumGenericType <T, ulong> .FromInt(intValue);
     }
     else if (jsonDeSerializer.DeSerializeState == DeSerializeState.Success)
     {
         return(false);
     }
     return(true);
 }
Пример #16
0
        public void TestCatsCountOfFemaleOwnerWhenThereIsOnlyOneCat()
        {
            // Arrange
            string    jsonData  = "[{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]}]";
            InputData inputData = new InputData();

            inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            IPetService petService = new PetService();

            var result = petService.GetPets(inputData, Gender.Female, PetType.Cat);

            Assert.AreEqual(1, result.Count);
        }
Пример #17
0
        private TestDependencies GetTestDependencies()
        {
            string    jsonData  = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null}]}]";
            InputData inputData = new InputData();

            inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            IPetService petService = new PetService();

            return(new TestDependencies
            {
                petService = petService,
                inputData = inputData
            });
        }
Пример #18
0
        public void TestThrowExceptionIfGenderIsInvalid()
        {
            string jsonData = "[{\"name\":\"Bob\",\"gender\":\"FMale\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]}]";

            try
            {
                var result = JsonDeSerializer.FromJson(jsonData);
                Assert.Fail();
            }
            catch (Exception ex)
            {
                Assert.IsTrue(ex is GenderIncorrectException);
                Assert.AreEqual(ex.Message, "Invalid Gender: FMale");
            }
        }
Пример #19
0
        public void TestThrowExceptionIfDataIsNull()
        {
            string jsonData = null;

            try
            {
                var result = JsonDeSerializer.FromJson(jsonData);
                Assert.Fail();
            }
            catch (Exception ex)
            {
                Assert.IsTrue(ex is InputDataIncorrectException);
                Assert.AreEqual(ex.Message, "Data cannot be null or empty");
            }
        }
Пример #20
0
        /// <summary>
        /// 枚举值解析
        /// </summary>
        /// <param name="jsonDeSerializer">JSON 反序列化</param>
        /// <param name="value">目标数据</param>
        protected static void deSerialize(JsonDeSerializer jsonDeSerializer, ref T value)
        {
            int index = enumSearcher.SearchString(jsonDeSerializer);

            if (index != -1)
            {
                value = enumValues[index];
            }
            else if (jsonDeSerializer.Config.IsMatchEnum)
            {
                jsonDeSerializer.DeSerializeState = DeSerializeState.NoFoundEnumValue;
            }
            else if (jsonDeSerializer.DeSerializeState == DeSerializeState.Success)
            {
                jsonDeSerializer.SearchStringEnd();
            }
        }
Пример #21
0
 internal static void DeSerializeTcpServer(JsonDeSerializer deSerializer, ref T value)
 {
     if (DefaultDeSerializer == null)
     {
         if (deSerializer.SearchObject())
         {
             DeSerializeMembers(deSerializer, ref value);
         }
         else
         {
             value = default(T);
         }
     }
     else
     {
         DefaultDeSerializer(deSerializer, ref value);
     }
 }
Пример #22
0
        public void TestThrowExceptionOnRetrievingFish()
        {
            // Arrange
            string jsonData     = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]";
            var    dependencies = GetTestDependencies();

            dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            try
            {
                var result = dependencies.petStrategyFactory.Resolve(PetType.Fish);
                Assert.Fail();
            }
            catch (Exception ex)
            {
                Assert.IsTrue(ex is NotImplementedException);
            }
        }
Пример #23
0
 /// <summary>
 /// 枚举值解析
 /// </summary>
 /// <param name="jsonDeSerializer">JSON 反序列化</param>
 /// <param name="value">目标数据</param>
 public static void DeSerializeFlags(JsonDeSerializer jsonDeSerializer, ref T value)
 {
     if (!tryDeSerializeNumber(jsonDeSerializer, ref value))
     {
         if (enumSearcher.State == null)
         {
             if (jsonDeSerializer.Config.IsMatchEnum)
             {
                 jsonDeSerializer.DeSerializeState = DeSerializeState.NoFoundEnumValue;
             }
             else
             {
                 jsonDeSerializer.Ignore();
             }
         }
         else
         {
             int index, nextIndex = -1;
             getIndex(jsonDeSerializer, ref value, out index, ref nextIndex);
             if (nextIndex != -1)
             {
                 ulong intValue = enumInts.ULong[index];
                 intValue |= enumInts.ULong[nextIndex];
                 while (jsonDeSerializer.Quote != 0)
                 {
                     index = enumSearcher.NextFlagEnum(jsonDeSerializer);
                     if (jsonDeSerializer.DeSerializeState == DeSerializeState.Success)
                     {
                         if (index != -1)
                         {
                             intValue |= enumInts.ULong[index];
                         }
                     }
                     else
                     {
                         return;
                     }
                 }
                 value = AutoCSer.Metadata.EnumGenericType <T, ulong> .FromInt(intValue);
             }
         }
     }
 }
Пример #24
0
        public void TestCatsListOfFemaleOwnerWhenThereMoreThanOneCat_SortedAscending()
        {
            // Arrange
            string jsonData     = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]";
            var    dependencies = GetTestDependencies();

            dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            var expectedOutput = new List <string> {
                "Garfield", "Simba", "Tabby"
            };

            var result = dependencies.catStrategy.GetPetsOfFemaleOwner();

            Assert.AreEqual(expectedOutput.Count, result.Count);
            Assert.AreEqual(expectedOutput[0], result[0]);
            Assert.AreEqual(expectedOutput[1], result[1]);
            Assert.AreEqual(expectedOutput[2], result[2]);
        }
Пример #25
0
        public static void Main(string[] args)
        {
            HttpClientService httpClientService = new HttpClientService();
            // Read data from Http Service
            string jsonData = httpClientService.Get();

            // Deserialize json data
            InputData data = new InputData();

            data.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData);

            if (data.ownerAndTheirPets != null)
            {
                // Get Pets of Pet types listed
                List <PetType> getPetsOfType = new List <PetType>()
                {
                    PetType.Cat
                };

                IPetService   petService       = new PetService();
                OutputService outPutService    = new OutputService();
                var           stratergyFactory = new PetStrategyFactory(petService, data);

                // Determine the strategy and get pets based on PetType and Owner Gender
                foreach (PetType petType in getPetsOfType)
                {
                    var           Strategy        = stratergyFactory.Resolve(petType);
                    List <string> maleOwnerPets   = Strategy.GetPetsOfMaleOwner();
                    List <string> femaleOwnerCats = Strategy.GetPetsOfFemaleOwner();

                    outPutService.PrintOutput(petType, maleOwnerPets, femaleOwnerCats);
                }
            }
            else
            {
                Console.WriteLine("No data to process");
            }

            Console.ReadKey();
        }
Пример #26
0
        /// <summary>
        /// 数组解析
        /// </summary>
        /// <param name="jsonDeSerializer">Json解析器</param>
        /// <param name="array">目标数据</param>
        /// <returns>数据数量,-1表示失败</returns>
        internal static int ArrayIndex(JsonDeSerializer jsonDeSerializer, ref T[] array)
        {
            switch (jsonDeSerializer.SearchArray(ref array))
            {
            case 0:
                array = new T[jsonDeSerializer.Config.NewArraySize];
                int index = 0;
                do
                {
                    if (index != array.Length)
                    {
                        DeSerialize(jsonDeSerializer, ref array[index]);
                        if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success)
                        {
                            return(-1);
                        }
                        ++index;
                    }
                    else
                    {
                        T value = default(T);
                        DeSerialize(jsonDeSerializer, ref value);
                        if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success)
                        {
                            return(-1);
                        }
                        array          = array.copyNew(index == 0 ? jsonDeSerializer.Config.NewArraySize : (index << 1));
                        array[index++] = value;
                    }
                }while (jsonDeSerializer.IsNextArrayValue());
                return(jsonDeSerializer.DeSerializeState == DeSerializeState.Success ? index : -1);

            case 1: return(0);

            default: return(-1);
            }
        }
Пример #27
0
        static TypeDeSerializer()
        {
            Type       type       = typeof(T);
            MethodInfo methodInfo = JsonDeSerializer.GetDeSerializeMethod(type);

            if (methodInfo != null)
            {
                DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo);
                return;
            }
            if (type.IsArray)
            {
                if (type.GetArrayRank() == 1)
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type.GetElementType()).JsonDeSerializeArrayMethod;
                }
                else
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type).JsonDeSerializeNotSupportDelegate;
                }
                return;
            }
            if (type.IsEnum)
            {
                if (type.IsDefined(typeof(FlagsAttribute), false))
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)EnumGenericType.Get(type).JsonDeSerializeEnumFlagsDelegate;
                }
                else
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)EnumGenericType.Get(type).JsonDeSerializeEnumDelegate;
                }
                return;
            }
            if (type.isSerializeNotSupport())
            {
                DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type).JsonDeSerializeNotSupportDelegate;
                return;
            }
            if (type.IsGenericType)
            {
                Type genericType = type.GetGenericTypeDefinition();
                if (genericType == typeof(Dictionary <,>))
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeDictionaryMethod;
                    return;
                }
                if (genericType == typeof(Nullable <>))
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)DeSerializeMethodCache.GetNullable(type);
                    return;
                }
                if (genericType == typeof(KeyValuePair <,>))
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeKeyValuePairMethod;
                    isValueType         = true;
                    return;
                }
            }
            if ((methodInfo = DeSerializeMethodCache.GetCustom(type)) != null)
            {
                if (type.IsValueType)
                {
#if NOJIT
                    DefaultDeSerializer = new CustomDeSerializer(methodInfo).DeSerialize;
#else
                    DynamicMethod dynamicMethod = new DynamicMethod("CustomJsonDeSerializer", null, new Type[] { typeof(JsonDeSerializer), type.MakeByRefType() }, type, true);
                    ILGenerator   generator     = dynamicMethod.GetILGenerator();
                    generator.Emit(OpCodes.Ldarg_1);
                    generator.Emit(OpCodes.Ldarg_0);
                    generator.call(methodInfo);
                    generator.Emit(OpCodes.Ret);
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)dynamicMethod.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>));
#endif
                }
                else
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo);
                }
            }
            else
            {
                Type attributeType;
                attribute = type.customAttribute <JsonDeSerializeAttribute>(out attributeType) ?? JsonDeSerializer.AllMemberAttribute;
                if ((methodInfo = DeSerializeMethodCache.GetIEnumerableConstructor(type)) != null)
                {
                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo);
                }
                else
                {
                    if (type.IsValueType)
                    {
                        isValueType = true;
                    }
                    else if (attribute != JsonDeSerializer.AllMemberAttribute && attributeType != type)
                    {
                        for (Type baseType = type.BaseType; baseType != typeof(object); baseType = baseType.BaseType)
                        {
                            JsonDeSerializeAttribute baseAttribute = baseType.customAttribute <JsonDeSerializeAttribute>();
                            if (baseAttribute != null)
                            {
                                if (baseAttribute.IsBaseType)
                                {
                                    methodInfo          = DeSerializeMethodCache.BaseDeSerializeMethod.MakeGenericMethod(baseType, type);
                                    DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo);
                                    return;
                                }
                                break;
                            }
                        }
                    }
                    FieldIndex             defaultMember = null;
                    LeftArray <FieldIndex> fields        = DeSerializeMethodCache.GetFields(MemberIndexGroup <T> .GetFields(attribute.MemberFilters), attribute, ref defaultMember);
                    LeftArray <KeyValue <PropertyIndex, MethodInfo> > properties = DeSerializeMethodCache.GetProperties(MemberIndexGroup <T> .GetProperties(attribute.MemberFilters), attribute);
                    bool isBox = false;
                    if (type.IsValueType && fields.Length + properties.Length == 1)
                    {
                        BoxSerializeAttribute boxSerialize = AutoCSer.Metadata.TypeAttribute.GetAttribute <BoxSerializeAttribute>(type);
                        if (boxSerialize != null && boxSerialize.IsJson)
                        {
                            isBox         = true;
                            defaultMember = null;
                        }
                    }
                    TryDeSerializeFilter[] deSerializers = new TryDeSerializeFilter[fields.Length + properties.Length + (defaultMember == null ? 0 : 1)];
                    //memberMap.type memberMapType = memberMap<valueType>.TypeInfo;
                    string[] names = isBox ? null : new string[deSerializers.Length];
#if !NOJIT
                    DeSerializeDynamicMethod dynamicMethod = isBox ? default(DeSerializeDynamicMethod) : new DeSerializeDynamicMethod(type, false), memberMapDynamicMethod = isBox ? default(DeSerializeDynamicMethod) : new DeSerializeDynamicMethod(type, true);
#endif
                    int index = 0, nameLength = 0, maxNameLength = 0;
                    foreach (FieldIndex member in fields)
                    {
                        TryDeSerializeFilter tryDeSerialize = deSerializers[index] = new TryDeSerializeFilter
                        {
#if NOJIT
                            TryDeSerialize = new FieldDeSerializer(member.Member).DeSerializer(),
#else
                            TryDeSerialize = (JsonDeSerializer.DeSerializeDelegate <T>)DeSerializeMethodCache.CreateDynamicMethod(type, member.Member).CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>)),
#endif
                            MemberMapIndex = member.MemberIndex,
                            //MemberFilters = member.Member.IsPublic ? Metadata.MemberFilters.PublicInstanceField : Metadata.MemberFilters.NonPublicInstanceField
                        };
                        if (!isBox)
                        {
#if !NOJIT
                            dynamicMethod.Push(member);
                            memberMapDynamicMethod.Push(member);
#endif
                            string name = member.AnonymousName;
                            if (name.Length > maxNameLength)
                            {
                                maxNameLength = name.Length;
                            }
                            nameLength += (names[index++] = name).Length;
                            if (member == defaultMember)
                            {
                                deSerializers[deSerializers.Length - 1] = tryDeSerialize;
                                names[deSerializers.Length - 1]         = string.Empty;
                            }
                        }
                    }
                    foreach (KeyValue <PropertyIndex, MethodInfo> member in properties)
                    {
                        deSerializers[index] = new TryDeSerializeFilter
                        {
#if NOJIT
                            TryDeSerialize = new PropertyDeSerializer(member.Key.Member).DeSerializer(),
#else
                            TryDeSerialize = (JsonDeSerializer.DeSerializeDelegate <T>)DeSerializeMethodCache.CreateDynamicMethod(type, member.Key.Member, member.Value).CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>)),
#endif
                            MemberMapIndex = member.Key.MemberIndex,
                            //MemberFilters = member.Value.IsPublic ? Metadata.MemberFilters.PublicInstanceProperty : Metadata.MemberFilters.NonPublicInstanceProperty
                        };
                        if (!isBox)
                        {
#if !NOJIT
                            dynamicMethod.Push(member.Key, member.Value);
                            memberMapDynamicMethod.Push(member.Key, member.Value);
#endif
                            if (member.Key.Member.Name.Length > maxNameLength)
                            {
                                maxNameLength = member.Key.Member.Name.Length;
                            }
                            nameLength += (names[index++] = member.Key.Member.Name).Length;
                        }
                    }
                    if (isBox)
                    {
                        unboxDeSerializer   = deSerializers[0].TryDeSerialize;
                        DefaultDeSerializer = unbox;
                    }
                    else
                    {
#if !NOJIT
                        deSerializeMember    = (DeSerializeMember)dynamicMethod.Create <DeSerializeMember>();
                        deSerializeMemberMap = (DeSerializeMemberMap)memberMapDynamicMethod.Create <DeSerializeMemberMap>();
#endif
                        if (type.Name[0] == '<')
                        {
                            isAnonymousType = true;
                        }
                        if (maxNameLength > (short.MaxValue >> 1) - 4 || nameLength == 0)
                        {
                            memberNames = Unmanaged.NullByte8;
                        }
                        else
                        {
                            memberNames = Unmanaged.GetStaticPointer((nameLength + (names.Length - (defaultMember == null ? 0 : 1)) * 5 + 1) << 1, false);
                            byte *write = memberNames.Byte;
                            foreach (string name in names)
                            {
                                if (name.Length != 0)
                                {
                                    if (write == memberNames.Byte)
                                    {
                                        *(short *)write = (short)((name.Length + 3) * sizeof(char));
                                        *(char *)(write + sizeof(short)) = '"';
                                        write += sizeof(short) + sizeof(char);
                                    }
                                    else
                                    {
                                        *(short *)write = (short)((name.Length + 4) * sizeof(char));
                                        *(int *)(write + sizeof(short)) = ',' + ('"' << 16);
                                        write += sizeof(short) + sizeof(int);
                                    }
                                    fixed(char *nameFixed = name) AutoCSer.Extensions.StringExtension.SimpleCopyNotNull(nameFixed, (char *)write, name.Length);

                                    *(int *)(write += name.Length << 1) = '"' + (':' << 16);
                                    write += sizeof(int);
                                }
                            }
                            *(short *)write = 0;
                        }
                        memberSearcher      = new StateSearcher(StateSearcher.GetMemberSearcher(type, names));
                        memberDeSerializers = deSerializers;

                        Type refType = type.MakeByRefType();
                        foreach (AutoCSer.Metadata.AttributeMethod attributeMethod in AutoCSer.Metadata.AttributeMethod.GetStatic(type))
                        {
                            if ((methodInfo = attributeMethod.Method).ReturnType == typeof(void))
                            {
                                ParameterInfo[] parameters = methodInfo.GetParameters();
                                if (parameters.Length == 3 && parameters[0].ParameterType == typeof(JsonDeSerializer) && parameters[1].ParameterType == refType && parameters[2].ParameterType == Emit.Pub.PointerSizeRefType)
                                {
                                    if (attributeMethod.GetAttribute <JsonDeSerializeUnknownNameAttriubte>() != null)
                                    {
                                        onUnknownName = (UnknownDeSerialize)Delegate.CreateDelegate(typeof(UnknownDeSerialize), methodInfo);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #28
0
 private void checkQuoteString()
 {
     Type = JsonDeSerializer.DeSerializeQuoteString(ref SubString, (int)(Int64 >> 32), (char)Int64, (int)Int64 >> 16) ? NodeType.String : NodeType.ErrorQuoteString;
 }
Пример #29
0
        /// <summary>
        /// 输出字符串
        /// </summary>
        /// <param name="charStream"></param>
        /// <param name="deSerializer"></param>
        private void toString(CharStream charStream, ref JsonDeSerializer deSerializer)
        {
            switch (Type)
            {
            case NodeType.String:
            case NodeType.NumberString:
            case NodeType.ErrorQuoteString:
                charStream.Write(ref SubString);
                return;

            case NodeType.QuoteString:
                if (deSerializer == null)
                {
                    deSerializer = JsonDeSerializer.YieldPool.Default.Pop() ?? new JsonDeSerializer();
                }
                if (!deSerializer.DeSerializeQuoteString(ref SubString, charStream, (int)(Int64 >> 32), (char)Int64))
                {
                    Type = NodeType.ErrorQuoteString;
                }
                return;

            case NodeType.NaN:
                charStream.WriteJsonNaN();
                return;

            case NodeType.PositiveInfinity:
                charStream.WritePositiveInfinity();
                return;

            case NodeType.NegativeInfinity:
                charStream.WriteNegativeInfinity();
                return;

            case NodeType.DateTimeTick:
                new DateTime(Int64, DateTimeKind.Local).ToString(charStream);
                return;

            case NodeType.Bool:
                charStream.WriteJsonBool((int)Int64 != 0);
                return;

            case NodeType.Array:
                int count = (int)Int64;
                if (count == 0)
                {
                    charStream.WriteJsonArray();
                }
                int isNext = 0;
                charStream.Write('[');
                foreach (Node node in ListArray)
                {
                    if (isNext == 0)
                    {
                        isNext = 1;
                    }
                    else
                    {
                        charStream.Write(',');
                    }
                    node.toString(charStream, ref deSerializer);
                    if (--count == 0)
                    {
                        charStream.Write(']');
                        return;
                    }
                }
                return;

            case NodeType.Dictionary:
                charStream.WriteJsonObjectString();
                return;
            }
        }
Пример #30
0
 public static DeSerializeResult fromJson <T>(this T value, string json, DeSerializeConfig config = null)
 {
     return(JsonDeSerializer.DeSerialize(json, ref value, config));
 }