Exemple #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");
        }
        public static TypeKey ReadTypeKey(IBinaryTokenStreamReader reader)
        {
            var hashCode = reader.ReadInt();
            var count    = reader.ReadUShort();
            var typeName = reader.ReadBytes(count);

            return(new TypeKey(hashCode, typeName));
        }
Exemple #3
0
        internal static InputStream Create(IBinaryTokenStreamReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            return(new InputStream(reader));
        }
Exemple #4
0
        internal static UniqueKey ReadUniqueKey(this IBinaryTokenStreamReader @this)
        {
            ulong  n0           = @this.ReadULong();
            ulong  n1           = @this.ReadULong();
            ulong  typeCodeData = @this.ReadULong();
            string keyExt       = @this.ReadString();

            return(UniqueKey.NewKey(n0, n1, typeCodeData, keyExt));
        }
Exemple #5
0
        private static Type[] ReadGenericArguments(this IBinaryTokenStreamReader @this, SerializationManager serializationManager, int n)
        {
            var args = new Type[n];

            for (var i = 0; i < n; i++)
            {
                args[i] = @this.ReadFullTypeHeader(serializationManager);
            }
            return(args);
        }
Exemple #6
0
        /// <summary> Read an <c>ActivationAddress</c> value from the stream. </summary>
        /// <returns>Data from current position in stream, converted to the appropriate output type.</returns>
        internal static ActivationAddress ReadActivationAddress(this IBinaryTokenStreamReader @this)
        {
            var silo  = @this.ReadSiloAddress();
            var grain = @this.ReadGrainId();
            var act   = @this.ReadActivationId();

            if (silo.Equals(SiloAddress.Zero))
            {
                silo = null;
            }

            if (act.Equals(ActivationId.Zero))
            {
                act = null;
            }

            return(ActivationAddress.GetAddress(silo, grain, act));
        }
 public StreamReaderWrapper(IBinaryTokenStreamReader reader)
 {
     this.reader = reader;
 }
        public Type ReadNamedType(IBinaryTokenStreamReader reader)
        {
            var key = ReadTypeKey(reader);

            return(this.GetTypeFromTypeKey(key, throwOnError: true));
        }
Exemple #9
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);
        }
Exemple #10
0
 /// <summary> Read a <c>SerializationTokenType</c> value from the stream. </summary>
 /// <returns>Data from current position in stream, converted to the appropriate output type.</returns>
 internal static SerializationTokenType ReadToken(this IBinaryTokenStreamReader @this)
 {
     // TODO try to avoid that
     return(((BinaryTokenStreamReader)@this).ReadToken());
 }
Exemple #11
0
        internal static GrainDirectoryEntryStatus ReadMultiClusterStatus(this IBinaryTokenStreamReader @this)
        {
            byte val = @this.ReadByte();

            return((GrainDirectoryEntryStatus)val);
        }
Exemple #12
0
 internal static CorrelationId ReadCorrelationId(this IBinaryTokenStreamReader @this)
 {
     return(new CorrelationId(@this.ReadBytes(CorrelationId.SIZE_BYTES)));
 }
Exemple #13
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");
        }
Exemple #14
0
        /// <summary> Read an <c>ActivationId</c> value from the stream. </summary>
        /// <returns>Data from current position in stream, converted to the appropriate output type.</returns>
        internal static ActivationId ReadActivationId(this IBinaryTokenStreamReader @this)
        {
            UniqueKey key = @this.ReadUniqueKey();

            return(ActivationId.GetActivationId(key));
        }
Exemple #15
0
        /// <summary> Read an <c>GrainId</c> value from the stream. </summary>
        /// <returns>Data from current position in stream, converted to the appropriate output type.</returns>
        internal static GrainId ReadGrainId(this IBinaryTokenStreamReader @this)
        {
            UniqueKey key = @this.ReadUniqueKey();

            return(GrainId.GetGrainId(key));
        }
Exemple #16
0
        internal static GuidId DeserializeFromStream(IBinaryTokenStreamReader stream)
        {
            Guid guid = stream.ReadGuid();

            return(GuidId.GetGuidId(guid));
        }
Exemple #17
0
 private static bool ReadBool(IBinaryTokenStreamReader stream)
 {
     return(stream.ReadByte() == (byte)SerializationTokenType.True);
 }
Exemple #18
0
 private InputStream(IBinaryTokenStreamReader reader)
 {
     this.reader = reader;
 }