Exemple #1
0
        /// <summary>
        /// Decodes byte array according to the underlying object type.
        /// </summary>
        /// <param name="data">The data to decode</param>
        public T Decode(byte[] data)
        {
            WakeTuplePBuf pbuf = WakeTuplePBuf.Deserialize(data);

            if (pbuf == null)
            {
                return(default(T));
            }

            // Get object's class Type
            Type type;

            if (!_nameMap.TryGetValue(pbuf.className, out type))
            {
                return(default(T));
            }

            // Get decoder for that type
            object decoder;

            if (!_decoderMap.TryGetValue(type, out decoder))
            {
                Exceptions.Throw(new RemoteRuntimeException("Decoder for " + type + " not known."), LOGGER);
            }

            // Invoke the decoder to decode the byte array
            Type       handlerType = typeof(IDecoder <>).MakeGenericType(new[] { type });
            MethodInfo info        = handlerType.GetMethod("Decode");

            return((T)info.Invoke(decoder, new[] { (object)pbuf.data }));
        }
Exemple #2
0
        /// <summary>Encodes an object to a byte array</summary>
        /// <param name="obj"></param>
        public byte[] Encode(T obj)
        {
            // Find encoder for object type
            object encoder;

            if (!_encoderMap.TryGetValue(obj.GetType(), out encoder))
            {
                return(null);
            }

            // Invoke encoder for this type
            Type       handlerType = typeof(IEncoder <>).MakeGenericType(new[] { obj.GetType() });
            MethodInfo info        = handlerType.GetMethod("Encode");

            byte[] data = (byte[])info.Invoke(encoder, new[] { (object)obj });

            // Serialize object type and object data into well known tuple
            // To decode, deserialize the tuple, get object type, and look up the
            // decoder for that type
            string name = _nameMap[obj.GetType()];

            _logger.Log(Level.Verbose, "Encoding name for " + name);
            WakeTuplePBuf pbuf = new WakeTuplePBuf {
                className = name, data = data
            };

            pbuf.className = name;
            pbuf.data      = data;
            return(pbuf.Serialize());
        }