public object Read(Serializer serializer, CustomData customData) { var message = (Message) customData.Data; var dataType = (DataType) serializer.ReadByte(); switch (dataType) { case DataType.DataObject: if(!typeof(IDataObject).IsAssignableFrom(customData.Type)) throw new Exception(); return ReadDataObject(serializer, customData.Type, message); case DataType.Delegate: var remoteDelegateId = serializer.ReadI32(); var contextId = message.RemotingManager.ContextManager.GetContextId(customData.RequestingAssembly); var del = message.RemotingManager.DelegateManager.CreateDelegateProxy(contextId, customData.Type, message.Peer, remoteDelegateId); return del.Delegate; case DataType.Service: var remoteId = serializer.ReadI32(); return message.RemotingManager.ServiceManager.GetService(customData.Type, message.Peer, remoteId); default: throw new NotImplementedException(); } }