private static void PutEnum(this NetDataWriter writer, object value, Type type)
        {
            if (!type.IsEnum)
            {
                throw new ArgumentException("T must be an enumerated type");
            }

            writer.PutObject(value, type.GetEnumUnderlyingType());
        }
        private static void PutObject(this NetDataWriter writer, object value, Type type)
        {
            if (value == null || type == null)
            {
                return;
            }

            if (value is INetSerializable)
            {
                (value as INetSerializable).Serialize(writer);
            }
            else if (type.IsEnum)
            {
                writer.PutObject(value, type.GetEnumUnderlyingType());
            }
            else if (type == typeof(bool))
            {
                writer.Put((bool)value);
            }
            else if (type == typeof(byte))
            {
                writer.Put((byte)value);
            }
            else if (type == typeof(sbyte))
            {
                writer.Put((sbyte)value);
            }
            else if (type == typeof(char))
            {
                writer.Put((char)value);
            }
            else if (type == typeof(short))
            {
                writer.Put((short)value);
            }
            else if (type == typeof(ushort))
            {
                writer.Put((ushort)value);
            }
            else if (type == typeof(int))
            {
                writer.Put((int)value);
            }
            else if (type == typeof(uint))
            {
                writer.Put((uint)value);
            }
            else if (type == typeof(long))
            {
                writer.Put((long)value);
            }
            else if (type == typeof(ulong))
            {
                writer.Put((ulong)value);
            }
            else if (type == typeof(float))
            {
                writer.Put((float)value);
            }
            else if (type == typeof(double))
            {
                writer.Put((double)value);
            }
            else if (type == typeof(string))
            {
                writer.Put((string)value);
            }
            else if (type == typeof(IPEndPoint))
            {
                writer.Put((IPEndPoint)value);
            }
            else
            {
                throw new Exception("Unable to serialize object " + value + " of type " + type);
            }
        }