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); }
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); }
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); }
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; } }
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); }
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); } }
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); }
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); }
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); }
private object ReadMember(BinaryReader reader, MemberInfo 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 EnKnownType.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 EnKnownType.Int16: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarInt16Nullable(reader)); } return(PrimitivesConvertion.ReadVarInt16(reader)); case EnKnownType.UInt16: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarUInt16Nullable(reader)); } return(PrimitivesConvertion.ReadVarUInt16(reader)); case EnKnownType.Int32: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarInt32Nullable(reader)); } return(PrimitivesConvertion.ReadVarInt32(reader)); case EnKnownType.Int64: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarInt64Nullable(reader)); } return(PrimitivesConvertion.ReadVarInt64(reader)); case EnKnownType.UInt64: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarUInt64Nullable(reader)); } return(PrimitivesConvertion.ReadVarUInt64(reader)); case EnKnownType.UInt32: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarUInt32Nullable(reader)); } return(PrimitivesConvertion.ReadVarUInt32(reader)); case EnKnownType.Double: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarDoubleNullable(reader)); } return(PrimitivesConvertion.ReadVarDouble(reader)); case EnKnownType.Decimal: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarDecimalNullable(reader)); } return(PrimitivesConvertion.ReadVarDecimal(reader)); case EnKnownType.Single: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarSingleNullable(reader)); } return(PrimitivesConvertion.ReadVarSingle(reader)); case EnKnownType.Byte: return(reader.ReadByte()); case EnKnownType.SByte: return(reader.ReadSByte()); case EnKnownType.ByteArray: return(ReadBytes(reader)); case EnKnownType.String: return(ReadString(reader)); case EnKnownType.Char: var charByte = reader.ReadUInt16(); return((char)charByte); case EnKnownType.Bool: return(ReadBoolean(reader)); case EnKnownType.Enum: return(ReadEnum(reader, actualMemberType)); case EnKnownType.DateTime: return(ReadDateTime(reader)); case EnKnownType.DateTimeOffset: return(ReadDateTimeOffset(reader)); case EnKnownType.TimeSpan: return(ReadTimeSpan(reader)); case EnKnownType.DataSet: return(ReadDataset(reader, actualMemberType)); case EnKnownType.DataTable: return(ReadDataTable(reader)); case EnKnownType.NameValueColl: return(ReadCollectionNameValue(reader, actualMemberType)); case EnKnownType.Color: return(ReadColor(reader)); case EnKnownType.Version: return(ReadVersion(reader)); case EnKnownType.DbNull: return(DBNull.Value); case EnKnownType.Guid: return(ReadGuid(reader)); case EnKnownType.Uri: return(ReadUri(reader)); default: throw new ArgumentOutOfRangeException(); } return(null); }
private object ReadColor(BinaryReader reader) { return(Color.FromArgb(PrimitivesConvertion.ReadVarInt32(reader))); }
private byte[] ReadBytes(BinaryReader reader) { var length = PrimitivesConvertion.ReadVarInt32(reader); return(reader.ReadBytes(length)); }
private object ReadEnum(BinaryReader reader, Type type) { var val = PrimitivesConvertion.ReadVarInt32(reader); return(Enum.ToObject(type, val)); }