/// <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 })); }
/// <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()); }