/// <summary>
        /// Registers a custom serializer that decomposes an interface into the properties
        /// </summary>
        /// <param name="serializer">The serializer to register on.</param>
        /// <param name="filter">An optional filter for the properties</param>
        /// <typeparam name="T">The type to register the custom serializer for.</typeparam>
        public static void RegisterPropertyDecomposer <T>(this TypeSerializer serializer, Func <System.Reflection.PropertyInfo, bool> filter = null)
        {
            filter = filter ?? (x => true);
            var fields = typeof(T)
                         .GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Public)
                         .Where(x => x.GetIndexParameters().Length == 0)
                         .Where(filter)
                         .ToArray();

            var types = new Type[] { typeof(string[]) }.Concat(fields.Select(x => x.PropertyType)).ToArray();
            var names = fields.Select(x => x.Name).ToArray();

            serializer.RegisterCustomSerializer(
                typeof(T),
                (a, b) => new Tuple <Type[], object[]>(
                    types,
                    new object[] { names }.Concat(fields.Select(x => x.GetValue(b, null))).ToArray()
                    ),
                (a, b) => AutomaticProxy.WrapPropertyDecomposedInstance(null, a, typeof(T), b)
                );
        }
 /// <summary>
 /// Registers a custom serializer/deserializer for <see cref="IPEndPoint"/>
 /// </summary>
 /// <param name="serializer">The type serializer.</param>
 public static void RegisterIPEndPointSerializers(this TypeSerializer serializer)
 {
     serializer.RegisterCustomSerializer(typeof(IPEndPoint), SerializeIPEndPoint, DeserializeIPEndPoint);
 }