示例#1
0
        /// <summary> Read a <c>Type</c> value from the stream. </summary>
        /// <param name="this">The IBinaryTokenStreamReader to read from</param>
        /// <param name="serializationManager">The serialization manager used to resolve type names.</param>
        /// <param name="expected">Expected Type, if known.</param>
        /// <returns>Data from current position in stream, converted to the appropriate output type.</returns>
        private static Type ReadFullTypeHeader(this IBinaryTokenStreamReader @this, SerializationManager serializationManager, Type expected = null)
        {
            var token = @this.ReadToken();

            if (token == SerializationTokenType.ExpectedType)
            {
                return(expected);
            }

            var t = CheckSpecialTypeCode(token);

            if (t != null)
            {
                return(t);
            }

            if (token == SerializationTokenType.SpecifiedType)
            {
#if TRACE_SERIALIZATION
                var tt = ReadSpecifiedTypeHeader();
                Trace("--Read specified type header for type {0}", tt);
                return(tt);
#else
                return(@this.ReadSpecifiedTypeHeader(serializationManager));
#endif
            }

            throw new SerializationException("Invalid '" + token + "'token in input stream where full type header is expected");
        }
示例#2
0
        internal static bool TryReadSimpleType(this IBinaryTokenStreamReader @this, out object result, out SerializationTokenType token)
        {
            token = @this.ReadToken();
            byte[] bytes;
            switch (token)
            {
            case SerializationTokenType.True:
                result = true;
                break;

            case SerializationTokenType.False:
                result = false;
                break;

            case SerializationTokenType.Null:
                result = null;
                break;

            case SerializationTokenType.Object:
                result = new object();
                break;

            case SerializationTokenType.Int:
                result = @this.ReadInt();
                break;

            case SerializationTokenType.Uint:
                result = @this.ReadUInt();
                break;

            case SerializationTokenType.Short:
                result = @this.ReadShort();
                break;

            case SerializationTokenType.Ushort:
                result = @this.ReadUShort();
                break;

            case SerializationTokenType.Long:
                result = @this.ReadLong();
                break;

            case SerializationTokenType.Ulong:
                result = @this.ReadULong();
                break;

            case SerializationTokenType.Byte:
                result = @this.ReadByte();
                break;

            case SerializationTokenType.Sbyte:
                result = @this.ReadSByte();
                break;

            case SerializationTokenType.Float:
                result = @this.ReadFloat();
                break;

            case SerializationTokenType.Double:
                result = @this.ReadDouble();
                break;

            case SerializationTokenType.Decimal:
                result = @this.ReadDecimal();
                break;

            case SerializationTokenType.String:
                result = @this.ReadString();
                break;

            case SerializationTokenType.Character:
                result = @this.ReadChar();
                break;

            case SerializationTokenType.Guid:
                bytes  = @this.ReadBytes(16);
                result = new Guid(bytes);
                break;

            case SerializationTokenType.Date:
                result = DateTime.FromBinary(@this.ReadLong());
                break;

            case SerializationTokenType.TimeSpan:
                result = new TimeSpan(@this.ReadLong());
                break;

            case SerializationTokenType.GrainId:
                result = @this.ReadGrainId();
                break;

            case SerializationTokenType.ActivationId:
                result = @this.ReadActivationId();
                break;

            case SerializationTokenType.SiloAddress:
                result = @this.ReadSiloAddress();
                break;

            case SerializationTokenType.ActivationAddress:
                result = @this.ReadActivationAddress();
                break;

            case SerializationTokenType.IpAddress:
                result = @this.ReadIPAddress();
                break;

            case SerializationTokenType.IpEndPoint:
                result = @this.ReadIPEndPoint();
                break;

            case SerializationTokenType.CorrelationId:
                result = new CorrelationId(@this.ReadBytes(CorrelationId.SIZE_BYTES));
                break;

            default:
                result = null;
                return(false);
            }
            return(true);
        }
示例#3
0
        /// <summary> Read a <c>Type</c> value from the stream. </summary>
        internal static Type ReadSpecifiedTypeHeader(this IBinaryTokenStreamReader @this, SerializationManager serializationManager)
        {
            // Assumes that the SpecifiedType token has already been read

            var token = @this.ReadToken();

            switch (token)
            {
            case SerializationTokenType.Boolean:
                return(typeof(bool));

            case SerializationTokenType.Int:
                return(typeof(int));

            case SerializationTokenType.Short:
                return(typeof(short));

            case SerializationTokenType.Long:
                return(typeof(long));

            case SerializationTokenType.Sbyte:
                return(typeof(sbyte));

            case SerializationTokenType.Uint:
                return(typeof(uint));

            case SerializationTokenType.Ushort:
                return(typeof(ushort));

            case SerializationTokenType.Ulong:
                return(typeof(ulong));

            case SerializationTokenType.Byte:
                return(typeof(byte));

            case SerializationTokenType.Float:
                return(typeof(float));

            case SerializationTokenType.Double:
                return(typeof(double));

            case SerializationTokenType.Decimal:
                return(typeof(decimal));

            case SerializationTokenType.String:
                return(typeof(string));

            case SerializationTokenType.Character:
                return(typeof(char));

            case SerializationTokenType.Guid:
                return(typeof(Guid));

            case SerializationTokenType.Date:
                return(typeof(DateTime));

            case SerializationTokenType.TimeSpan:
                return(typeof(TimeSpan));

            case SerializationTokenType.IpAddress:
                return(typeof(IPAddress));

            case SerializationTokenType.IpEndPoint:
                return(typeof(IPEndPoint));

            case SerializationTokenType.GrainId:
                return(typeof(GrainId));

            case SerializationTokenType.ActivationId:
                return(typeof(ActivationId));

            case SerializationTokenType.SiloAddress:
                return(typeof(SiloAddress));

            case SerializationTokenType.ActivationAddress:
                return(typeof(ActivationAddress));

            case SerializationTokenType.CorrelationId:
                return(typeof(CorrelationId));

            case SerializationTokenType.Request:
                return(typeof(InvokeMethodRequest));

            case SerializationTokenType.Response:
                return(typeof(Response));

            case SerializationTokenType.StringObjDict:
                return(typeof(Dictionary <string, object>));

            case SerializationTokenType.Object:
                return(typeof(Object));

            case SerializationTokenType.Tuple + 1:
                return(typeof(Tuple <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.Tuple + 2:
                return(typeof(Tuple <,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 2)));

            case SerializationTokenType.Tuple + 3:
                return(typeof(Tuple <, ,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 3)));

            case SerializationTokenType.Tuple + 4:
                return(typeof(Tuple <, , ,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 4)));

            case SerializationTokenType.Tuple + 5:
                return(typeof(Tuple <, , , ,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 5)));

            case SerializationTokenType.Tuple + 6:
                return(typeof(Tuple <, , , , ,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 6)));

            case SerializationTokenType.Tuple + 7:
                return(typeof(Tuple <, , , , , ,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 7)));

            case SerializationTokenType.Array + 1:
                var et1 = @this.ReadFullTypeHeader(serializationManager);
                return(et1.MakeArrayType());

            case SerializationTokenType.Array + 2:
                var et2 = @this.ReadFullTypeHeader(serializationManager);
                return(et2.MakeArrayType(2));

            case SerializationTokenType.Array + 3:
                var et3 = @this.ReadFullTypeHeader(serializationManager);
                return(et3.MakeArrayType(3));

            case SerializationTokenType.Array + 4:
                var et4 = @this.ReadFullTypeHeader(serializationManager);
                return(et4.MakeArrayType(4));

            case SerializationTokenType.Array + 5:
                var et5 = @this.ReadFullTypeHeader(serializationManager);
                return(et5.MakeArrayType(5));

            case SerializationTokenType.Array + 6:
                var et6 = @this.ReadFullTypeHeader(serializationManager);
                return(et6.MakeArrayType(6));

            case SerializationTokenType.Array + 7:
                var et7 = @this.ReadFullTypeHeader(serializationManager);
                return(et7.MakeArrayType(7));

            case SerializationTokenType.Array + 8:
                var et8 = @this.ReadFullTypeHeader(serializationManager);
                return(et8.MakeArrayType(8));

            case SerializationTokenType.List:
                return(typeof(List <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.Dictionary:
                return(typeof(Dictionary <,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 2)));

            case SerializationTokenType.KeyValuePair:
                return(typeof(KeyValuePair <,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 2)));

            case SerializationTokenType.Set:
                return(typeof(HashSet <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.SortedList:
                return(typeof(SortedList <,>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 2)));

            case SerializationTokenType.SortedSet:
                return(typeof(SortedSet <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.Stack:
                return(typeof(Stack <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.Queue:
                return(typeof(Queue <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.LinkedList:
                return(typeof(LinkedList <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.Nullable:
                return(typeof(Nullable <>).MakeGenericType(@this.ReadGenericArguments(serializationManager, 1)));

            case SerializationTokenType.ByteArray:
                return(typeof(byte[]));

            case SerializationTokenType.ShortArray:
                return(typeof(short[]));

            case SerializationTokenType.IntArray:
                return(typeof(int[]));

            case SerializationTokenType.LongArray:
                return(typeof(long[]));

            case SerializationTokenType.UShortArray:
                return(typeof(ushort[]));

            case SerializationTokenType.UIntArray:
                return(typeof(uint[]));

            case SerializationTokenType.ULongArray:
                return(typeof(ulong[]));

            case SerializationTokenType.FloatArray:
                return(typeof(float[]));

            case SerializationTokenType.DoubleArray:
                return(typeof(double[]));

            case SerializationTokenType.CharArray:
                return(typeof(char[]));

            case SerializationTokenType.BoolArray:
                return(typeof(bool[]));

            case SerializationTokenType.SByteArray:
                return(typeof(sbyte[]));

            case SerializationTokenType.NamedType:
                var typeName = @this.ReadString();
                try
                {
                    return(serializationManager.ResolveTypeName(typeName));
                }
                catch (TypeAccessException ex)
                {
                    throw new TypeAccessException("Named type \"" + typeName + "\" is invalid: " + ex.Message);
                }

            default:
                break;
            }

            throw new SerializationException("Unexpected '" + token + "' found when expecting a type reference");
        }