예제 #1
0
        public override object Read(Reader reader, int tag)
        {
            if (tag >= '0' && tag <= '9')
            {
                return(digitObject[tag - '0']);
            }
            var stream = reader.Stream;

            switch (tag)
            {
            case TagInteger:
                return(ValueReader.ReadInt(stream));

            case TagString:
                return(ReferenceReader.ReadString(reader));

            case TagBytes:
                return(ReferenceReader.ReadBytes(reader));

            case TagTrue:
                return(trueObject);

            case TagFalse:
                return(falseObject);

            case TagEmpty:
                return("");

            case TagObject:
                return(Read(reader));

            case TagRef:
                return(reader.ReadReference());

            case TagDate:
                return(ReferenceReader.ReadDateTime(reader));

            case TagTime:
                return(ReferenceReader.ReadTime(reader));

            case TagGuid:
                return(ReferenceReader.ReadGuid(reader));

            case TagLong:
                switch (reader.LongType)
                {
                case LongType.Int64:
                    return(ValueReader.ReadLong(stream));

                case LongType.UInt64:
                    return((ulong)ValueReader.ReadLong(stream));

                default:
                    return(ValueReader.ReadBigInteger(stream));
                }

            case TagDouble:
                switch (reader.RealType)
                {
                case RealType.Single:
                    return(ValueReader.ReadSingle(stream));

                case RealType.Decimal:
                    return(ValueReader.ReadDecimal(stream));

                default:
                    return(ValueReader.ReadDouble(stream));
                }

            case TagNaN:
                switch (reader.RealType)
                {
                case RealType.Single:
                    return(float.NaN);

                default:
                    return(double.NaN);
                }

            case TagInfinity:
                switch (reader.RealType)
                {
                case RealType.Single:
                    return(ValueReader.ReadSingleInfinity(stream));

                default:
                    return(ValueReader.ReadInfinity(stream));
                }

            case TagUTF8Char:
                switch (reader.CharType)
                {
                case CharType.Char:
                    return(ValueReader.ReadChar(stream));

                default:
                    return(ValueReader.ReadUTF8Char(stream));
                }

            case TagList:
                switch (reader.ListType)
                {
                case ListType.Array:
                    return(ReferenceReader.ReadArray <object>(reader));

                case ListType.ArrayList:
                    return(ListDeserializer <ArrayList> .Read(reader));

                default:
                    return(CollectionDeserializer <List <object>, object> .Read(reader));
                }

            case TagMap:
                switch (reader.DictType)
                {
                case DictType.Dictionary:
                    return(DictionaryDeserializer <Dictionary <object, object>, object, object> .Read(reader));

                case DictType.ExpandoObject:
                    return(ExpandoObjectDeserializer.Read(reader));

                case DictType.Hashtable:
                    return(DictionaryDeserializer <Hashtable> .Read(reader));

                default:
                    return(DictionaryDeserializer <NullableKeyDictionary <object, object>, object, object> .Read(reader));
                }

            case TagError:
                return(new Exception(reader.Deserialize <string>()));

            default:
                return(base.Read(reader, tag));
            }
        }
예제 #2
0
 /// <summary>
 /// For APIs whose response is an array of a single type.
 /// </summary>
 /// <typeparam name="T">Type of the response array members</typeparam>
 /// <param name="request">Request JSON body</param>
 /// <param name="deserializer">Response JSON deserializer</param>
 /// <returns></returns>
 protected Task <List <T> > List <T>(string request, ListDeserializer <T> deserializer
                                     , CancellationTokenSource cancel = null)
 {
     return(Core(request, res => deserializer(res), cancel));
 }
예제 #3
0
 /// <summary>
 /// For APIs whose response is an array of a single type.
 /// </summary>
 /// <typeparam name="T">Type of the response array members</typeparam>
 /// <param name="request">Request JSON body</param>
 /// <param name="deserializer">Response JSON deserializer</param>
 /// <returns></returns>
 protected async Task <List <T> > List <T>(string request, ListDeserializer <T> deserializer
                                           , CancellationTokenSource cancel = null)
 {
     return(await Core <List <T> >(request, (res) => { return deserializer(res); }, cancel).ConfigureAwait(false));
 }