/// <summary>
        /// 将 JSON 字符串反序列化为指定类型的值。
        /// </summary>
        /// <typeparam name="T">指定类型</typeparam>
        /// <param name="chars">JSON 字符串</param>
        /// <param name="length">JSON 字符串长度</param>
        /// <returns>返回指定类型的值</returns>
        public T Deserialize <T>(char *chars, int length)
        {
            var options = Options;

            if ((options & JsonFormatterOptions.MultiReferencingReference) != 0)
            {
                var jsonDeserializer = new JsonReferenceDeserializer(chars, length);

                if (id != 0)
                {
                    jsonDeserializer.jsonFormatter = this;
                }

                var result = ValueInterface <T> .ReadValue(jsonDeserializer);

                if (jsonDeserializer.references.Count != 0)
                {
                    ReferenceInfo.ProcessReference(result, jsonDeserializer.references);

                    if (jsonDeserializer.updateBase)
                    {
                        result = RWHelper.GetContent <T>(jsonDeserializer.writer);
                    }
                }

                return(result);
            }
            else
            {
                var jsonDeserializer = new JsonDeserializer(chars, length);

                if (id != 0)
                {
                    jsonDeserializer.jsonFormatter = this;
                }

                return(ValueInterface <T> .ReadValue(jsonDeserializer));
            }
        }
        public static T DeserializeObject <T>(char *chars, int length, JsonFormatterOptions options)
        {
            if ((options & JsonFormatterOptions.MultiReferencingReference) != 0)
            {
                var jsonDeserializer = new JsonReferenceDeserializer(chars, length);

                var result = ValueInterface <T> .ReadValue(jsonDeserializer);

                if (jsonDeserializer.references.Count != 0)
                {
                    ReferenceInfo.ProcessReference(result, jsonDeserializer.references);

                    if (jsonDeserializer.updateBase)
                    {
                        result = RWHelper.GetContent <T>(jsonDeserializer.writer);
                    }
                }

                return(result);
            }

            return(DeserializeObject <T>(chars, length));
        }
Esempio n. 3
0
        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());
            }
        }
Esempio n. 4
0
        public unsafe static StringBuilder Format <T>(string text, T args)
        {
            if (text == null)
            {
                return(null);
            }

            var reader = RWHelper.CreateReader(args).As <string>();

            var builder = new StringBuilder();

            fixed(char *pChars = text)
            {
                var length = text.Length;

                var startIndex = 0;

                for (int i = 0; i < length; i++)
                {
                    if (pChars[i] == '\\' && i + 1 < length)
                    {
                        builder.Append(text, startIndex, i - startIndex);

                        builder.Append(pChars[i + 1]);

                        ++i;

                        startIndex = i + 1;

                        continue;
                    }

                    if (pChars[i] == '{')
                    {
                        if (length - i >= 3)
                        {
                            builder.Append(text, startIndex, i - startIndex);

                            startIndex = i;

                            for (++i; i < length; i++)
                            {
                                if (pChars[i] == '}')
                                {
                                    var name = new string(pChars, startIndex + 1, i - startIndex - 1);

                                    var value = reader[name].DirectRead();

                                    if (value is StringBuilder sb)
                                    {
                                        var sbLength = sb.Length;

                                        for (int s = 0; s < sbLength; s++)
                                        {
                                            builder.Append(sb[s]);
                                        }
                                    }
                                    else if (value != null)
                                    {
                                        builder.Append(value.ToString());
                                    }

                                    startIndex = i + 1;

                                    break;
                                }
                            }
                        }
                    }
                }

                builder.Append(text, startIndex, length - startIndex);
            }

            return(builder);
        }
Esempio n. 5
0
 public static void DeserializeTo <T>(this IBinaryFormatter binaryFormatter, HGlobalCache <byte> hGCache, T obj)
 {
     binaryFormatter.DeserializeTo(hGCache, RWHelper.CreateWriter(obj));
 }
Esempio n. 6
0
 public static void DeserializeTo <T>(this IBinaryFormatter binaryFormatter, Stream stream, T obj)
 {
     binaryFormatter.DeserializeTo(stream, RWHelper.CreateWriter(obj));
 }
Esempio n. 7
0
 public static void DeserializeTo <T>(this IBinaryFormatter binaryFormatter, byte[] bytes, T obj)
 {
     binaryFormatter.DeserializeTo(bytes, RWHelper.CreateWriter(obj));
 }
Esempio n. 8
0
 public static void DeserializeTo <T>(this ITextFormatter textFormatter, HGlobalCache <char> hGCache, T obj)
 {
     textFormatter.DeserializeTo(hGCache, RWHelper.CreateWriter(obj));
 }
Esempio n. 9
0
 public static void DeserializeTo <T>(this ITextFormatter textFormatter, TextReader textReader, T obj)
 {
     textFormatter.DeserializeTo(textReader, RWHelper.CreateWriter(obj));
 }
Esempio n. 10
0
 public static void DeserializeTo <T>(this IBinaryFormatter binaryFromatter, ReadOnlySpan <byte> text, T obj)
 {
     binaryFromatter.DeserializeTo(text, RWHelper.CreateWriter(obj));
 }
Esempio n. 11
0
 public static void DeserializeTo <T>(this ITextFormatter textFormatter, ReadOnlySpan <char> text, T obj)
 {
     textFormatter.DeserializeTo(text, RWHelper.CreateWriter(obj));
 }
Esempio n. 12
0
 public static async Task DeserializeToAsync <T>(this ITextFormatter textFormatter, Stream stream, T obj)
 {
     await textFormatter.DeserializeToAsync(stream, RWHelper.CreateWriter(obj));
 }
Esempio n. 13
0
        public void ReferencingTest()
        {
            var obj = new { Id = 123, Name = "Dogwei", Obj = (object)null };
            var arr = new object[2];

            arr[0] = new { Id = 123 };
            arr[1] = arr[0];

            RWHelper.CreateRW(obj).As <string>()["Obj"].DirectWrite(obj);

            AreEqual(
                JsonFormatter.SerializeObject(obj, JsonFormatterOptions.LoopReferencingNull),
                "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":null}"
                );

            AreEqual(
                JsonFormatter.SerializeObject(obj, JsonFormatterOptions.MultiReferencingNull),
                "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":null}"
                );

            AreEqual(
                JsonFormatter.SerializeObject(obj, JsonFormatterOptions.MultiReferencingReference),
                "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":{\"$ref\":\"#\"}}"
                );

            Catch <JsonOutOfDepthException>(() => JsonFormatter.SerializeObject(obj));
            Catch <JsonLoopReferencingException>(() => JsonFormatter.SerializeObject(obj, JsonFormatterOptions.LoopReferencingException));

            AreEqual(
                JsonFormatter.SerializeObject(arr, JsonFormatterOptions.LoopReferencingNull),
                "[{\"Id\":123},{\"Id\":123}]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(arr, JsonFormatterOptions.MultiReferencingNull),
                "[{\"Id\":123},null]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(arr, JsonFormatterOptions.MultiReferencingReference),
                "[{\"Id\":123},{\"$ref\":\"#/0\"}]"
                );

            JsonFormatter.SerializeObject(arr);
            JsonFormatter.SerializeObject(arr, JsonFormatterOptions.LoopReferencingException);

            AreEqual(
                JsonFormatter.SerializeObject(ValueInterface <DataTable> .ReadValue(ValueCopyer.ValueOf(arr)), JsonFormatterOptions.MultiReferencingNull),
                "[{\"Id\":123},{\"Id\":123}]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(ValueInterface <DataTable> .ReadValue(ValueCopyer.ValueOf(arr)).CreateDataReader(), JsonFormatterOptions.MultiReferencingNull),
                "[{\"Id\":123},{\"Id\":123}]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(Enumerable.Range(0, 10), JsonFormatterOptions.MultiReferencingNull),
                "[0,1,2,3,4,5,6,7,8,9]"
                );

            var mar = new object[, ] {
                { arr[0], arr[0] }, { arr[0], arr[0] }
            };

            AreEqual(
                JsonFormatter.SerializeObject(mar, JsonFormatterOptions.LoopReferencingNull),
                "[[{\"Id\":123},{\"Id\":123}],[{\"Id\":123},{\"Id\":123}]]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(mar, JsonFormatterOptions.MultiReferencingNull),
                "[[{\"Id\":123},null],[null,null]]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(mar, JsonFormatterOptions.MultiReferencingReference),
                "[[{\"Id\":123},{\"$ref\":\"#/0/0\"}],[{\"$ref\":\"#/0/0\"},{\"$ref\":\"#/0/0\"}]]"
                );

            JsonFormatter.SerializeObject(mar);
            JsonFormatter.SerializeObject(mar, JsonFormatterOptions.LoopReferencingException);

            var dic2 = JsonFormatter.DeserializeObject <object[]>("[{\"Id\":123},{\"$ref\":\"#/0\"}]");

            AreEqual(JsonFormatter.SerializeObject(dic2[1]), "{\"$ref\":\"#/0\"}");

            var mar2 = JsonFormatter.DeserializeObject <object[, ]>("[[{\"Id\":123},{\"$ref\":\"#/0/0\"}],[{\"$ref\":\"#/0/0\"},{\"$ref\":\"#/0/0\"}]]", JsonFormatterOptions.MultiReferencingReference);

            AreEqual(mar2[0, 0], mar2[0, 1]);
            AreEqual(mar2[1, 0], mar2[0, 1]);
            AreEqual(mar2[1, 0], mar2[1, 1]);
        }