Exemple #1
0
        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));
            }
        }
Exemple #2
0
        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);
            }
        }