Esempio n. 1
0
        private object ReadDictionary(BinaryReader reader, Type memType)
        {
            var count = PrimitivesConvertion.ReadVarInt32(reader);

            var typeToCreate = memType;
            var genericArgs  = memType.GetGenericArguments();

            var genericBase = typeof(IDictionary <,>);

            if (genericBase == memType.GetGenericTypeDefinition())
            {
                typeToCreate = typeof(Dictionary <,>).MakeGenericType(genericArgs);
            }

            var dic = _typeCache.CreateInstanceDirect(typeToCreate) as IDictionary;

            var keyType = genericArgs[0];
            var valType = genericArgs[1];

            for (int i = 0; i < count; i++)
            {
                var key = ReadMember(reader, keyType);
                var val = ReadMember(reader, valType);
                dic.Add(key, val);
            }
            return(dic);
        }
Esempio n. 2
0
        private object ReadDataset(BinaryReader reader, Type memType)
        {
            var count = PrimitivesConvertion.ReadVarInt32(reader);
            var ds    = _typeCache.CreateInstance(memType) as DataSet;

            for (int i = 0; i < count; i++)
            {
                var dt = ReadDataTable(reader);
                ds.Tables.Add(dt);
            }
            return(ds);
        }
Esempio n. 3
0
        private object ReadCollectionNameValue(BinaryReader reader, Type type)
        {
            var count     = PrimitivesConvertion.ReadVarInt32(reader);
            var nameValue = (NameValueCollection)_typeCache.CreateInstance(type);
            var strType   = typeof(string);

            for (int i = 0; i < count; i++)
            {
                var name = ReadMember(reader, strType) as string;
                var val  = ReadMember(reader, strType) as string;
                nameValue.Add(name, val);
            }
            return(nameValue);
        }
Esempio n. 4
0
        private void ReadDataRow(BinaryReader reader, DataRow row, DataColumnCollection cols)
        {
            var itemCount   = PrimitivesConvertion.ReadVarInt32(reader);
            var colCount    = cols.Count;
            var passedIndex = 0;

            while (passedIndex < colCount && passedIndex < itemCount)
            {
                passedIndex++;

                var colIndex = PrimitivesConvertion.ReadVarInt32(reader);
                var col      = cols[colIndex];
                var val      = ReadMember(reader, col.DataType);
                row[col] = val ?? DBNull.Value;
            }
        }
Esempio n. 5
0
        private object ReadStringDictionary(BinaryReader reader, Type memType)
        {
            var count = PrimitivesConvertion.ReadVarInt32(reader);
            var dic   = _typeCache.CreateInstance(memType) as IDictionary;

            var genericType = memType.GetGenericArguments();
            var keyType     = genericType[0];
            var valType     = genericType[1];

            for (int i = 0; i < count; i++)
            {
                var key = ReadMember(reader, keyType);
                var val = ReadMember(reader, valType);
                dic.Add(key, val);
            }
            return(dic);
        }
Esempio n. 6
0
        private object ReadArray(BinaryReader reader, Type type)
        {
            var count = PrimitivesConvertion.ReadVarInt32(reader);

            var itemType = type.GetElementType();

            if (itemType == null)
            {
                itemType = ReflectionHelper.FindUnderlyingGenericElementType(type);

                if (itemType == null)
                {
                    throw new ArgumentException("Unknown 'Object' array type is not supported.\n" + type);
                }
            }

            IList lst;

            if (type.IsArray)
            {
                var arr = ReflectionHelper.CreateArray(itemType, count);
                lst = arr as IList;

                for (int i = 0; i < count; i++)
                {
                    var val = ReadMember(reader, itemType);
                    lst[i] = val;
                }
                return(arr);
            }
            else
            {
                lst = _typeCache.CreateInstance(type) as IList;

                for (int i = 0; i < count; i++)
                {
                    var val = ReadMember(reader, itemType);
                    lst.Add(val);
                }
                return(lst);
            }
        }
Esempio n. 7
0
        private DataTable ReadDataTable(BinaryReader reader)
        {
            var dt = _typeCache.CreateInstance(typeof(DataTable)) as DataTable;

            var schema = ReadString(reader);

            //dt.TableName = name;
            SetXmlSchema(dt, schema);

            var cols = dt.Columns;

            var rowCount = PrimitivesConvertion.ReadVarInt32(reader);

            for (int i = 0; i < rowCount; i++)
            {
                var row = dt.Rows.Add();
                ReadDataRow(reader, row, cols);
            }
            return(dt);
        }
Esempio n. 8
0
        private IList ReadIListImpl(BinaryReader reader, Type type)
        {
            var count = PrimitivesConvertion.ReadVarInt32(reader);

            var listObj = (IList)_typeCache.CreateInstance(type);

            var itemType = type.GetElementType();

            if (itemType == null)
            {
                throw new ArgumentException("Unknown ICollection implementation is not supported.\n" + type.ToString());
            }

            for (int i = 0; i < count; i++)
            {
                var val = ReadMember(reader, itemType);
                listObj.Add(val);
            }

            return(listObj);
        }
Esempio n. 9
0
        private IList ReadGenericList(BinaryReader reader, Type type)
        {
            var count = PrimitivesConvertion.ReadVarInt32(reader);

            var typeToCreate = type;
            var itemType     = type.GetGenericArguments()[0];

            var ilistBase = typeof(IList <>);

            if (ilistBase == type.GetGenericTypeDefinition())
            {
                typeToCreate = typeof(List <>).MakeGenericType(itemType);
            }

            var listObj = (IList)_typeCache.CreateInstanceDirect(typeToCreate);

            for (int i = 0; i < count; i++)
            {
                var val = ReadMember(reader, itemType);
                listObj.Add(val);
            }

            return(listObj);
        }
Esempio n. 10
0
        private object ReadMember(BinaryReader reader, BoisMemberInfo memInfo, Type memType)
        {
            if ((memInfo.IsNullable && memInfo.IsContainerObject) ||
                (memInfo.IsNullable && !memInfo.IsSupportedPrimitive && (!memInfo.IsContainerObject || memInfo.IsStruct)))
            {
                bool isNull = reader.ReadByte() != 0;

                if (isNull)
                {
                    return(null);
                }
            }
            var actualMemberType = memType;

            if (memInfo.IsNullable && memInfo.NullableUnderlyingType != null)
            {
                actualMemberType = memInfo.NullableUnderlyingType;
            }

            switch (memInfo.KnownType)
            {
            case EnBoisKnownType.Unknown:

                if (memInfo.IsContainerObject)
                {
                    return(ReadObject(reader, actualMemberType));
                }
                else if (memInfo.IsStringDictionary)
                {
                    return(ReadStringDictionary(reader, actualMemberType));
                }
                else if (memInfo.IsDictionary)
                {
                    return(ReadDictionary(reader, actualMemberType));
                }
                else if (memInfo.IsCollection)
                {
                    if (memInfo.IsGeneric)
                    {
                        return(ReadGenericList(reader, actualMemberType));
                    }
                    return(ReadArray(reader, actualMemberType));
                }
                else if (memInfo.IsArray)
                {
                    return(ReadArray(reader, actualMemberType));
                }

                break;

            case EnBoisKnownType.Int16:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarInt16Nullable(reader));
                }
                return(PrimitivesConvertion.ReadVarInt16(reader));

            case EnBoisKnownType.UInt16:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarUInt16Nullable(reader));
                }
                return(PrimitivesConvertion.ReadVarUInt16(reader));

            case EnBoisKnownType.Int32:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarInt32Nullable(reader));
                }
                return(PrimitivesConvertion.ReadVarInt32(reader));

            case EnBoisKnownType.Int64:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarInt64Nullable(reader));
                }
                return(PrimitivesConvertion.ReadVarInt64(reader));

            case EnBoisKnownType.UInt64:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarUInt64Nullable(reader));
                }
                return(PrimitivesConvertion.ReadVarUInt64(reader));

            case EnBoisKnownType.UInt32:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarUInt32Nullable(reader));
                }
                return(PrimitivesConvertion.ReadVarUInt32(reader));

            case EnBoisKnownType.Double:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarDoubleNullable(reader));
                }
                return(PrimitivesConvertion.ReadVarDouble(reader));

            case EnBoisKnownType.Decimal:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarDecimalNullable(reader));
                }
                return(PrimitivesConvertion.ReadVarDecimal(reader));

            case EnBoisKnownType.Single:
                if (memInfo.IsNullable)
                {
                    return(PrimitivesConvertion.ReadVarSingleNullable(reader));
                }
                return(PrimitivesConvertion.ReadVarSingle(reader));

            case EnBoisKnownType.Byte:
                return(reader.ReadByte());

            case EnBoisKnownType.SByte:
                return(reader.ReadSByte());

            case EnBoisKnownType.ByteArray:
                return(ReadBytes(reader));

            case EnBoisKnownType.String:
                return(ReadString(reader));

            case EnBoisKnownType.Char:
                var charByte = reader.ReadUInt16();
                return((char)charByte);

            case EnBoisKnownType.Bool:
                return(ReadBoolean(reader));

            case EnBoisKnownType.Enum:
                return(ReadEnum(reader, actualMemberType));

            case EnBoisKnownType.DateTime:
                return(ReadDateTime(reader));

            case EnBoisKnownType.DateTimeOffset:
                return(ReadDateTimeOffset(reader));

            case EnBoisKnownType.TimeSpan:
                return(ReadTimeSpan(reader));

#if !SILVERLIGHT && DotNet
            case EnBoisKnownType.DataSet:
                return(ReadDataset(reader, actualMemberType));

            case EnBoisKnownType.DataTable:
                return(ReadDataTable(reader));
#endif
#if DotNet || DotNetCore || DotNetStandard
            case EnBoisKnownType.NameValueColl:
                return(ReadCollectionNameValue(reader, actualMemberType));

            case EnBoisKnownType.Color:
                return(ReadColor(reader));

            case EnBoisKnownType.DbNull:
                return(DBNull.Value);
#endif

            case EnBoisKnownType.Version:
                return(ReadVersion(reader));

            case EnBoisKnownType.Guid:
                return(ReadGuid(reader));

            case EnBoisKnownType.Uri:
                return(ReadUri(reader));

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(null);
        }
Esempio n. 11
0
 private object ReadColor(BinaryReader reader)
 {
     return(Color.FromArgb(PrimitivesConvertion.ReadVarInt32(reader)));
 }
Esempio n. 12
0
        private byte[] ReadBytes(BinaryReader reader)
        {
            var length = PrimitivesConvertion.ReadVarInt32(reader);

            return(reader.ReadBytes(length));
        }
Esempio n. 13
0
        private object ReadEnum(BinaryReader reader, Type type)
        {
            var val = PrimitivesConvertion.ReadVarInt32(reader);

            return(Enum.ToObject(type, val));
        }