public static IList Create(Type elementType, DistinctAttribute distinctAttribute, SortedAttribute sortedAttribute) { var isDistinct = distinctAttribute != null; var isSorted = sortedAttribute != null; if (isSorted) { return(CreateSorted(elementType, sortedAttribute.ComparerType, isDistinct)); } else if (isDistinct) { return(CreateDistinct(elementType, distinctAttribute.EqualityComparerType)); } else { return(Create(elementType)); } }
public object ReadObject(Type objectType, ObjectTypeCode expectedTypeCode, bool isConvertible) { ObjectTypeCode typeCode; if (_objectByte.HasValue) { typeCode = (ObjectTypeCode)_objectByte.Value; _objectByte = null; } else { typeCode = (ObjectTypeCode)ReadByte(); } switch (typeCode) { case ObjectTypeCode.Boolean: return(ConvertIfNecessary(ReadBoolean(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Byte: return(ConvertIfNecessary(ReadByte(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.UInt16: return(ConvertIfNecessary(ReadUInt16(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.UInt32: return(ConvertIfNecessary(ReadUInt32(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.UInt64: return(ConvertIfNecessary(ReadUInt64(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.SByte: return(ConvertIfNecessary(ReadSByte(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Int16: return(ConvertIfNecessary(ReadInt16(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Int32: return(ConvertIfNecessary(ReadInt32(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Int64: return(ConvertIfNecessary(ReadInt64(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Char: return(ConvertIfNecessary(ReadChar(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.String: return(ConvertIfNecessary(ReadString(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Single: return(ConvertIfNecessary(ReadSingle(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Double: return(ConvertIfNecessary(ReadDouble(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.Decimal: return(ConvertIfNecessary(ReadDecimal(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.DateTime: return(ConvertIfNecessary(ReadDateTime(), objectType, typeCode, expectedTypeCode, isConvertible)); case ObjectTypeCode.ByteArray: return(ReadBytes()); case ObjectTypeCode.CharArray: return(ReadChars()); case ObjectTypeCode.TimeSpan: return(ReadTimeSpan()); case ObjectTypeCode.DateTimeOffset: return(ReadDateTimeOffset()); case ObjectTypeCode.Guid: return(ReadGuid()); case ObjectTypeCode.Version: return(ReadVersion()); case ObjectTypeCode.Uri: return(ReadUri()); case ObjectTypeCode.DBNull: return(DBNull.Value); case ObjectTypeCode.SimpleList: { var objectList = (IList)objectType.New(); ReadList(objectList, objectType.GetGenericArguments()[0]); return(objectList); } case ObjectTypeCode.ObjectMap: { var objectMap = (IDictionary)objectType.New(); var genericArgs = objectType.GetGenericArguments(); ReadDictionary(objectMap, genericArgs[0], genericArgs[1]); return(objectMap); } case ObjectTypeCode.Object: { var deserializer = CreateDelegate(objectType); var dataEntities = deserializer(this, 1); if (dataEntities != null && dataEntities.Length > 0) { return(dataEntities[0]); } return(null); } case ObjectTypeCode.ObjectList: case ObjectTypeCode.PolymorphicObjectList: { var itemCount = (int)ReadUInt32(); var listAspectType = (ListAspectType)ReadByte(); DistinctAttribute distinctAttribute = null; SortedAttribute sortedAttribute = null; if (listAspectType != ListAspectType.None) { var comparerType = GetType(ReadString()); switch (listAspectType) { case ListAspectType.Distinct: distinctAttribute = new DistinctAttribute { EqualityComparerType = comparerType }; break; case (ListAspectType.Sorted | ListAspectType.Distinct): case ListAspectType.Sorted: sortedAttribute = new SortedAttribute { ComparerType = comparerType }; if (listAspectType != ListAspectType.Sorted) { distinctAttribute = new DistinctAttribute(); } break; } } var list = List.Create(objectType, distinctAttribute, sortedAttribute); if (typeCode == ObjectTypeCode.PolymorphicObjectList) { var elementTypes = ReadList <string>().Select(t => Type.GetType(t, false)).ToArray(); for (var i = 0; i < itemCount; i++) { var pos = ReadInt32(); var dataEntity = ReadObject(elementTypes[pos], ObjectTypeCode.Object, false); list.Add(dataEntity); } } else { var deserializer = CreateDelegate(objectType); var dataEntities = deserializer(this, itemCount); for (var i = 0; i < dataEntities.Length; i++) { list.Add(dataEntities[i]); } } return(list); } default: return(null); } }