Exemple #1
0
        /// <summary>
        /// 将文档字符串反序列化到指定的对象中。
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="textFormatter">文档反序列化器</param>
        /// <param name="textReader">文档字符串读取器</param>
        /// <param name="obj">对象</param>
        public static void DeserializeTo <T>(this ITextFormatter textFormatter, TextReader textReader, T obj)
        {
            IDataWriter dataWriter;

            try
            {
                dataWriter = RWHelper.CreateRW(obj);
            }
            catch (NotSupportedException)
            {
                dataWriter = RWHelper.CreateWriter <T>();

                RWHelper.SetContent(dataWriter, obj);
            }

            if (dataWriter is IDataWriter <string> nameWriter)
            {
                DeserializeTo(textFormatter, textReader, nameWriter);
            }
            else if (dataWriter is IDataWriter <int> indexWriter)
            {
                DeserializeTo(textFormatter, textReader, indexWriter);
            }
            else
            {
                var invoker = new DeserializeToAsInvoker(textFormatter, textReader, dataWriter);

                AsHelper.GetInstance(dataWriter).Invoke(invoker);
            }
        }
        private void InternalDeserializeTo <TMode>(char *chars, int length, IDataWriter dataWriter) where TMode : struct
        {
            var jsonDeserializer = new JsonDeserializer <TMode>(chars, length);

            if (jsonDeserializer.IsObject)
            {
                if (dataWriter is IId64DataRW <char> fastWriter)
                {
                    jsonDeserializer.FastReadObject(fastWriter);
                }
                else
                {
                    jsonDeserializer.SlowReadObject(dataWriter.As <string>());
                }
            }
            else if (jsonDeserializer.IsArray)
            {
                jsonDeserializer.NoInliningReadArray(dataWriter.As <int>());
            }
            else
            {
                RWHelper.SetContent(dataWriter, jsonDeserializer.DirectRead());
            }
        }