public object Decompress(object payload, PayloadDescriptor payloadDescriptor)
        {
            var compressedPayload = payload as object[];
            var result = Activator.CreateInstance(payloadDescriptor.Type);
            var i = 0;

            // TODO: Throw error if the compressedPayload length != payloadDescriptor.Data length
            foreach (var data in payloadDescriptor.Data)
            {
                var value = compressedPayload[i++];

                // Convert value to null if it was minified as a 0
                value = CheckNull(value, data);

                if (value != null)
                {
                    if (_provider.HasPayload(data.Type))
                    {
                        data.SetValue(result, Decompress(ConvertToObjectArray(value), data.Type));
                    }
                    else // We're not directly a payload at this points
                    {
                        if (value.GetType() != data.Type)
                        {
                            value = Convert.ChangeType(value, data.Type);
                        }

                        data.SetValue(result, value);
                    }
                }
            }

            return result;
        }
        public static void ValidateMembersToPayloadDescriptor(Type type, PayloadDescriptor payload)
        {
            var descriptors = payload.Data;
            var expectedMemers = type.GetFields(BindingFlags.Public | BindingFlags.Instance).Union<MemberInfo>(type.GetProperties(BindingFlags.Public | BindingFlags.Instance));

            Assert.Equal(expectedMemers.Count(), descriptors.Count());

            foreach (var descriptor in descriptors)
            {
                Assert.True(expectedMemers.Where(member => member.Name == descriptor.Name).Count() == 1);
            }
        }