private void HandleMessage(int bytesReceived)
        {
            MemoryStream          stream         = new MemoryStream(this.buf, 0, bytesReceived, false, true);
            ChannelSerializerInfo serializerType = ReadHeader(stream);
            object o = null;

            switch (serializerType)
            {
            case ChannelSerializerInfo.BinarySerializer:
                if (this.formatter == null)
                {
                    this.formatter = new BinaryFormatter();                                                 //lazy cum load.
                }
                o = this.formatter.Deserialize(stream);
                break;

            case ChannelSerializerInfo.TestSerializer:
                o = TestSerializer.Deserialize(stream);
                break;

            case ChannelSerializerInfo.SceneEstimatorSerializer:
                o = SceneEstimatorSerializer.Deserialize(stream, name);
                if (o == null)
                {
                    return;
                }
                break;

            case ChannelSerializerInfo.PoseAbsoluteSerializer:
            case ChannelSerializerInfo.PoseRelativeSerializer:
                o = PoseSerializer.Deserialize(stream, serializerType, name);
                if (o == null)
                {
                    return;
                }
                break;

            case ChannelSerializerInfo.SideObstacleSerializer:
                o = SideObstaclesSerializer.Deserialize(stream, name);
                if (o == null)
                {
                    return;
                }
                break;

            case ChannelSerializerInfo.SideRoadEdgeSerializer:
                o = SideRoadEdgeSerializer.Deserialize(stream, name);
                if (o == null)
                {
                    return;
                }
                break;

            case ChannelSerializerInfo.RoadBearing:
                o = RoadBearingSerializer.Deserialize(stream);
                if (o == null)
                {
                    return;
                }
                break;

            case ChannelSerializerInfo.ExplicitlyUnsupported:
                //drop this message
                return;

            default:
                throw new NotImplementedException("Attempt to use unsupported deserializer for Receive: " + serializerType.ToString());
            }

            lock (this.listeners)
            {
                foreach (KeyValuePair <uint, IChannelListener> kvp in this.listeners)
                {
                    IChannelListener listener = kvp.Value;
                    try
                    {
                        if (listener is IAdvancedChannelListener)
                        {
                            if (listener != null)
                            {
                                (listener as IAdvancedChannelListener).MessageArrived(this.name, o, this.seqNumberRX);
                            }
                        }
                        if (listener != null)
                        {
                            listener.MessageArrived(this.name, o);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Listener Exception: " + ex.Message);
                        Console.WriteLine("Stack Trace:");
                        Console.WriteLine(ex.StackTrace);
                    }
                }
            }
            packetRXCount++;
        }