示例#1
0
        private object ReadValue(Stream input, ValueTag tag, Type objectType)
        {
            switch (tag.Type)
            {
            case ValueType.Array:
            {
                return(this.ReadArray(input, tag, objectType));
            }

            case ValueType.Object:
            {
                return(objectType == typeof(object) || objectType == typeof(Dictionary <string, object>)
                               ? this.ReadDictionary(input, tag, objectType)
                               : this.ReadObject(input, tag, objectType));
            }

            case ValueType.Bool:
            {
                return(input.ReadValueU8() != 0);
            }

            case ValueType.String:
            {
                return(this.ReadString(input, tag, objectType));
            }

            case ValueType.Int32:
            {
                return(input.ReadValueS32(Endian.Little));
            }

            case ValueType.Int64:
            {
                return(input.ReadValueS64(Endian.Little));
            }

            case ValueType.Float64:
            {
                return(input.ReadValueF64(Endian.Little));
            }

            case ValueType.Guid:
            {
                return(input.ReadValueGuid(Endian.Big));
            }

            case ValueType.SHA1:
            {
                var bytes = input.ReadBytes(20);
                return(new SHA1Hash(bytes));
            }

            case ValueType.Bytes:
            {
                var length       = input.ReadPackedValueUInt32();
                var basePosition = input.Position;
                var endPosition  = basePosition + length;
                if (endPosition > input.Length)
                {
                    throw new EndOfStreamException();
                }

                var value = input.ReadBytes(length);

                if (input.Position != endPosition)
                {
                    throw new FormatException();
                }

                return(value);
            }
            }

            throw new NotSupportedException();
        }
示例#2
0
        public object Deserialize(Stream input, Type objectType)
        {
            var tag = new ValueTag(input.ReadValueU8());

            return(this.ReadValue(input, tag, objectType));
        }
示例#3
0
        private object ReadArray(Stream input, ValueTag tag, Type objectType)
        {
            if (objectType == null)
            {
                throw new ArgumentNullException("objectType");
            }

            if (objectType != typeof(object) && objectType.IsArray == false && IsGenericList(objectType) == false)
            {
                throw new ArgumentException("objectType");
            }

            var length       = input.ReadPackedValueUInt32();
            var basePosition = input.Position;
            var endPosition  = basePosition + length;

            if (endPosition > input.Length)
            {
                throw new EndOfStreamException();
            }

            Type elementType;

            if (objectType == typeof(object))
            {
                elementType = typeof(object);
            }
            else if (objectType.IsArray == true)
            {
                // Type[]
                elementType = objectType.GetElementType();
            }
            else
            {
                // List<Type>
                elementType = objectType.GetGenericArguments().Single();
            }

            var listType = typeof(List <>).MakeGenericType(elementType);
            var list     = (IList)Activator.CreateInstance(listType);

            var elementTag = new ValueTag(input.ReadValueU8());

            if (elementTag.Type != ValueType.Invalid)
            {
                do
                {
                    var elementValue = this.ReadValue(input, elementTag, elementType);
                    list.Add(elementValue);
                    elementTag = new ValueTag(input.ReadValueU8());
                }while (elementTag.Type != ValueType.Invalid);
            }

            if (input.Position != endPosition)
            {
                throw new FormatException();
            }

            if (objectType == typeof(object) || objectType.IsArray != true)
            {
                // just want the list
                return(list);
            }

            var array = Array.CreateInstance(elementType, list.Count);

            for (int i = 0; i < list.Count; i++)
            {
                array.SetValue(list[i], i);
            }
            return(array);
        }