public override object FromBinary(byte[] bytes, Type type)
{
using (var ms = new MemoryStream(bytes))
{
var code = (MessageCode)ms.ReadByte();
switch (code)
{
case MessageCode.Notification:
{
// read observerId
var notificationMessage = new NotificationMessage();
notificationMessage.ObserverId = ms.Read7BitEncodedInt();
notificationMessage.NotificationId = ms.Read7BitEncodedInt();
// read message
var messageType = ReadType(ms);
if (messageType == null)
throw new Exception("Cannot resolve messageType.");
var message = Activator.CreateInstance(messageType);
try
{
AkkaSurrogate.CurrentSystem = system;
notificationMessage.InvokePayload = (IInvokable)_typeModel.Deserialize(ms, message, messageType);
}
finally
{
AkkaSurrogate.CurrentSystem = null;
}
return notificationMessage;
}
case MessageCode.Request:
{
// read requestId
var requestMessage = new RequestMessage();
requestMessage.RequestId = ms.Read7BitEncodedInt();
// read message
var messageType = ReadType(ms);
if (messageType == null)
throw new Exception("Cannot resolve messageType.");
var message = Activator.CreateInstance(messageType);
try
{
AkkaSurrogate.CurrentSystem = system;
requestMessage.InvokePayload = (IInterfacedPayload)_typeModel.Deserialize(ms, message, messageType);
}
finally
{
AkkaSurrogate.CurrentSystem = null;
}
return requestMessage;
}
case MessageCode.ReplyWithNothing:
{
var replyMessage = new ResponseMessage();
replyMessage.RequestId = ms.Read7BitEncodedInt();
return replyMessage;
}
case MessageCode.ReplyWithException:
{
var replyMessage = new ResponseMessage();
replyMessage.RequestId = ms.Read7BitEncodedInt();
var exceptionType = ReadType(ms);
replyMessage.Exception = (Exception)Activator.CreateInstance(exceptionType);
if (_typeModel.CanSerialize(exceptionType))
_typeModel.Deserialize(ms, replyMessage.Exception, exceptionType);
return replyMessage;
}
case MessageCode.ReplyWithResult:
{
// read requestId
var replyMessage = new ResponseMessage();
replyMessage.RequestId = ms.Read7BitEncodedInt();
// read result
var resultType = ReadType(ms);
if (resultType == null)
throw new Exception("Cannot resolve resultType.");
var result = Activator.CreateInstance(resultType);
try
{
AkkaSurrogate.CurrentSystem = system;
replyMessage.ReturnPayload = (IValueGetable)_typeModel.Deserialize(ms, result, resultType);
}
finally
{
AkkaSurrogate.CurrentSystem = null;
}
return replyMessage;
}
default:
{
return null;
}
}
}
}