Пример #1
0
        public override decimal Read(Reader reader, int tag)
        {
            var stream = reader.Stream;

            if (tag >= '0' && tag <= '9')
            {
                return(tag - '0');
            }
            switch (tag)
            {
            case TagInteger:
            case TagLong:
                return(ValueReader.ReadIntAsDecimal(stream));

            case TagDouble:
                return(ValueReader.ReadDecimal(stream));

            case TagTrue:
                return(1);

            case TagFalse:
            case TagEmpty:
                return(0);

            case TagUTF8Char:
                return(Converter <decimal> .Convert(ValueReader.ReadUTF8Char(stream)));

            case TagString:
                return(Converter <decimal> .Convert(ReferenceReader.ReadString(reader)));

            default:
                return(base.Read(reader, tag));
            }
        }
Пример #2
0
        public override char Read(Reader reader, int tag)
        {
            var stream = reader.Stream;

            switch (tag)
            {
            case TagUTF8Char:
                return(ValueReader.ReadChar(stream));

            case TagEmpty:
                return('\0');

            case TagInteger:
                return((char)ValueReader.ReadInt(stream));

            case TagLong:
                return((char)ValueReader.ReadLong(stream));

            case TagDouble:
                return((char)ValueReader.ReadDouble(stream));

            case TagString:
                return(Converter <char> .Convert(ReferenceReader.ReadString(reader)));

            default:
                if (tag >= '0' && tag <= '9')
                {
                    return((char)(tag - '0'));
                }
                return(base.Read(reader, tag));
            }
        }
Пример #3
0
        public override StringBuilder Read(Reader reader, int tag)
        {
            var stream = reader.Stream;

            switch (tag)
            {
            case TagString:
                return(Converter <StringBuilder> .Convert(ReferenceReader.ReadString(reader)));

            case TagUTF8Char:
                return(new StringBuilder(1).Append(ValueReader.ReadChar(stream)));

            case TagList:
                return(Converter <StringBuilder> .Convert(ReferenceReader.ReadArray <char>(reader)));

            case TagInteger:
            case TagLong:
            case TagDouble:
                return(ValueReader.ReadUntil(stream, TagSemicolon));

            case TagEmpty:
                return(new StringBuilder());

            case TagTrue:
                return(new StringBuilder(bool.TrueString));

            case TagFalse:
                return(new StringBuilder(bool.FalseString));

            case TagNaN:
                return(new StringBuilder(double.NaN.ToString()));

            case TagInfinity:
                return(new StringBuilder(ValueReader.ReadInfinity(stream).ToString()));

            case TagDate:
                return(Converter <StringBuilder> .Convert(ReferenceReader.ReadDateTime(reader)));

            case TagTime:
                return(Converter <StringBuilder> .Convert(ReferenceReader.ReadTime(reader)));

            case TagGuid:
                return(Converter <StringBuilder> .Convert(ReferenceReader.ReadGuid(reader)));

            case TagBytes:
                return(Converter <StringBuilder> .Convert(ReferenceReader.ReadBytes(reader)));

            default:
                if (tag >= '0' && tag <= '9')
                {
                    return(new StringBuilder(1).Append((char)tag));
                }
                return(base.Read(reader, tag));
            }
        }
Пример #4
0
        public override Guid Read(Reader reader, int tag)
        {
            switch (tag)
            {
            case TagGuid:
                return(ReferenceReader.ReadGuid(reader));

            case TagBytes:
                return(Converter <Guid> .Convert(ReferenceReader.ReadBytes(reader)));

            case TagString:
                return(Converter <Guid> .Convert(ReferenceReader.ReadString(reader)));

            default:
                return(base.Read(reader, tag));
            }
        }
        public override TimeSpan Read(Reader reader, int tag)
        {
            var stream = reader.Stream;

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

            case TagLong:
                return(new TimeSpan(ValueReader.ReadLong(stream)));

            case TagDouble:
                return(new TimeSpan((long)ValueReader.ReadDouble(stream)));

            case '0':
            case TagEmpty:
            case TagFalse:
                return(TimeSpan.Zero);

            case '1':
            case TagTrue:
                return(new TimeSpan(1));

            case TagUTF8Char:
                return(Converter <TimeSpan> .Convert(ValueReader.ReadUTF8Char(stream)));

            case TagString:
                return(Converter <TimeSpan> .Convert(ReferenceReader.ReadString(reader)));

            case TagDate:
                return(Converter <TimeSpan> .Convert(ReferenceReader.ReadDateTime(reader)));

            case TagTime:
                return(Converter <TimeSpan> .Convert(ReferenceReader.ReadTime(reader)));

            default:
                if (tag >= '2' && tag <= '9')
                {
                    return(new TimeSpan(tag - '0'));
                }
                return(base.Read(reader, tag));
            }
        }
Пример #6
0
        public override bool Read(Reader reader, int tag)
        {
            var stream = reader.Stream;

            switch (tag)
            {
            case TagTrue:
                return(true);

            case TagFalse:
            case TagEmpty:
            case TagNaN:
            case '0':
                return(false);

            case TagInteger:
                return(ValueReader.ReadInt(stream) != 0);

            case TagLong:
                return(!ValueReader.ReadBigInteger(stream).IsZero);

            case TagDouble:
                return(ValueReader.ReadDouble(stream) != 0);

            case TagUTF8Char:
                return("0\0".IndexOf(ValueReader.ReadChar(stream)) == -1);

            case TagString:
                return(Converter <bool> .Convert(ReferenceReader.ReadString(reader)));

            case TagInfinity:
                stream.ReadByte();
                return(true);

            default:
                if (tag >= '1' && tag <= '9')
                {
                    return(true);
                }
                return(base.Read(reader, tag));
            }
        }
Пример #7
0
        public override BigInteger Read(Reader reader, int tag)
        {
            if (tag >= '0' && tag <= '9')
            {
                return(tag - '0');
            }
            var stream = reader.Stream;

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

            case TagLong:
                return(ValueReader.ReadBigInteger(stream));

            case TagDouble:
                return((BigInteger)ValueReader.ReadDouble(stream));

            case TagTrue:
                return(1);

            case TagFalse:
            case TagEmpty:
                return(0);

            case TagUTF8Char:
                return(Converter <BigInteger> .Convert(ValueReader.ReadUTF8Char(stream)));

            case TagString:
                return(Converter <BigInteger> .Convert(ReferenceReader.ReadString(reader)));

            case TagDate:
                return(Converter <BigInteger> .Convert(ReferenceReader.ReadDateTime(reader)));

            case TagTime:
                return(Converter <BigInteger> .Convert(ReferenceReader.ReadTime(reader)));

            default:
                return(base.Read(reader, tag));
            }
        }
Пример #8
0
        public override float Read(Reader reader, int tag)
        {
            var stream = reader.Stream;

            if (tag >= '0' && tag <= '9')
            {
                return(tag - '0');
            }
            switch (tag)
            {
            case TagDouble:
                return(ValueReader.ReadSingle(stream));

            case TagInteger:
            case TagLong:
                return(ValueReader.ReadIntAsSingle(stream));

            case TagNaN:
                return(float.NaN);

            case TagInfinity:
                return(ValueReader.ReadSingleInfinity(stream));

            case TagTrue:
                return(1);

            case TagFalse:
            case TagEmpty:
                return(0);

            case TagUTF8Char:
                return(Converter <float> .Convert(ValueReader.ReadUTF8Char(stream)));

            case TagString:
                return(Converter <float> .Convert(ReferenceReader.ReadString(reader)));

            default:
                return(base.Read(reader, tag));
            }
        }
Пример #9
0
        public override T Read(Reader reader, int tag)
        {
            Type type = typeof(T);

            if (tag >= '0' && tag <= '9')
            {
                return((T)Enum.ToObject(type, tag - '0'));
            }
            var stream = reader.Stream;

            switch (tag)
            {
            case TagInteger:
                return((T)Enum.ToObject(type, ValueReader.ReadInt(stream)));

            case TagLong:
                return((T)Enum.ToObject(type, ValueReader.ReadLong(stream)));

            case TagDouble:
                return((T)Enum.ToObject(type, (long)ValueReader.ReadDouble(stream)));

            case TagTrue:
                return((T)Enum.ToObject(type, 1));

            case TagFalse:
            case TagEmpty:
                return((T)Enum.ToObject(type, 0));

            case TagUTF8Char:
                return((T)Enum.ToObject(type, ValueReader.ReadChar(stream)));

            case TagString:
                return(Converter <T> .Convert(ReferenceReader.ReadString(reader)));

            default:
                return(base.Read(reader, tag));
            }
        }
Пример #10
0
 public override short Read(Reader reader, int tag)
 {
     return(tag switch
     {
         '0' => 0,
         '1' => 1,
         '2' => 2,
         '3' => 3,
         '4' => 4,
         '5' => 5,
         '6' => 6,
         '7' => 7,
         '8' => 8,
         '9' => 9,
         TagInteger => (short)ValueReader.ReadInt(reader.Stream),
         TagLong => (short)ValueReader.ReadLong(reader.Stream),
         TagDouble => (short)ValueReader.ReadDouble(reader.Stream),
         TagTrue => 1,
         TagFalse => 0,
         TagEmpty => 0,
         TagUTF8Char => Converter <short> .Convert(ValueReader.ReadUTF8Char(reader.Stream)),
         TagString => Converter <short> .Convert(ReferenceReader.ReadString(reader)),
         _ => base.Read(reader, tag),
     });
Пример #11
0
        public override string Read(Reader reader, int tag)
        {
            var stream = reader.Stream;

            switch (tag)
            {
            case TagString:
                return(ReferenceReader.ReadString(reader));

            case TagUTF8Char:
                return(ValueReader.ReadUTF8Char(stream));

            case '0': return("0");

            case '1': return("1");

            case '2': return("2");

            case '3': return("3");

            case '4': return("4");

            case '5': return("5");

            case '6': return("6");

            case '7': return("7");

            case '8': return("8");

            case '9': return("9");

            case TagInteger:
            case TagLong:
            case TagDouble:
                return(ValueReader.ReadUntil(stream, TagSemicolon).ToString());

            case TagEmpty:
                return("");

            case TagTrue:
                return(bool.TrueString);

            case TagFalse:
                return(bool.FalseString);

            case TagNaN:
                return(double.NaN.ToString());

            case TagInfinity:
                return(ValueReader.ReadInfinity(stream).ToString());

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

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

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

            case TagBytes:
                return(Converter <string> .Convert(ReferenceReader.ReadBytes(reader)));

            case TagList:
                return(Converter <string> .Convert(ReferenceReader.ReadArray <char>(reader)));

            default:
                return(base.Read(reader, tag));
            }
        }
Пример #12
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));
            }
        }