예제 #1
0
        private static bool Init()
        {
            if (!typeof(T).IsClass && !typeof(T).IsInterface)
            {
                return(false);
            }

            var propertyInfos = TypeConfig <T> .Properties;

            if (propertyInfos.Length == 0)
            {
                return(typeof(T).IsDto());
            }

            var propertyNamesLength = propertyInfos.Length;

            PropertyWriters = new TypePropertyWriter[propertyNamesLength];

            for (var i = 0; i < propertyNamesLength; i++)
            {
                var propertyInfo = propertyInfos[i];

                PropertyWriters[i] = new TypePropertyWriter
                                     (
                    propertyInfo.Name,
                    propertyInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyInfo.PropertyType)
                                     );
            }

            return(true);
        }
예제 #2
0
        private static bool Init()
        {
            if (!typeof(T).IsClass && !typeof(T).IsInterface)
            {
                return(false);
            }

            var propertyInfos = TypeConfig <T> .Properties;

            if (propertyInfos.Length == 0 && !JsState.IsWritingDynamic)
            {
                return(typeof(T).IsDto());
            }

            var propertyNamesLength = propertyInfos.Length;

            PropertyWriters = new TypePropertyWriter[propertyNamesLength];

            // NOTE: very limited support for DataContractSerialization (DCS)
            //	NOT supporting Serializable
            //	support for DCS is intended for (re)Name of properties and Ignore by NOT having a DataMember present
            var isDataContract = typeof(T).GetCustomAttributes(typeof(DataContractAttribute), false).Any();

            for (var i = 0; i < propertyNamesLength; i++)
            {
                var propertyInfo = propertyInfos[i];

                string propertyName, propertyNameCLSFriendly;

                if (isDataContract)
                {
                    var dcsDataMember = propertyInfo.GetCustomAttributes(typeof(DataMemberAttribute), false).FirstOrDefault() as DataMemberAttribute;
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName            = dcsDataMember.Name ?? propertyInfo.Name;
                    propertyNameCLSFriendly = dcsDataMember.Name ?? propertyName.ToCamelCase();
                }
                else
                {
                    propertyName            = propertyInfo.Name;
                    propertyNameCLSFriendly = propertyName.ToCamelCase();
                }

                PropertyWriters[i] = new TypePropertyWriter
                                     (
                    propertyName,
                    propertyNameCLSFriendly,
                    propertyInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyInfo.PropertyType)
                                     );
            }

            return(true);
        }
예제 #3
0
        private static bool Init()
        {
            if (!typeof(T).IsClass && !typeof(T).IsInterface && !JsConfig.TreatAsRefType(typeof(T)))
            {
                return(false);
            }

            var propertyInfos       = TypeConfig <T> .Properties;
            var fieldInfos          = TypeConfig <T> .Fields;
            var propertyNamesLength = propertyInfos.Length;
            var fieldNamesLength    = fieldInfos.Length;

            PropertyWriters = new TypePropertyWriter[propertyNamesLength + fieldNamesLength];

            if (propertyNamesLength + fieldNamesLength == 0 && !JsState.IsWritingDynamic)
            {
                return(typeof(T).IsDto());
            }

            var shouldSerializeDynamic = ShouldSerialize(typeof(T));

            // NOTE: very limited support for DataContractSerialization (DCS)
            //  NOT supporting Serializable
            //  support for DCS is intended for (re)Name of properties and Ignore by NOT having a DataMember present
            var isDataContract = typeof(T).IsDto();

            for (var i = 0; i < propertyNamesLength; i++)
            {
                var propertyInfo = propertyInfos[i];

                string propertyName, propertyNameCLSFriendly, propertyNameLowercaseUnderscore, propertyDeclaredTypeName;
                var    propertyOrder = -1;
                var    propertyType  = propertyInfo.PropertyType;
                var    defaultValue  = propertyType.GetDefaultValue();
                var    propertySuppressDefaultConfig = defaultValue != null &&
                                                       propertyType.IsValueType &&
                                                       !propertyType.IsEnum &&
                                                       JsConfig.HasSerializeFn.Contains(propertyType) &&
                                                       !JsConfig.HasIncludeDefaultValue.Contains(propertyType);
                var propertySuppressDefaultAttribute = false;

                var shouldSerialize = GetShouldSerializeMethod(propertyInfo);
                if (isDataContract)
                {
                    var dcsDataMember = propertyInfo.GetDataMember();
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName                     = dcsDataMember.Name ?? propertyInfo.Name;
                    propertyNameCLSFriendly          = dcsDataMember.Name ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore  = dcsDataMember.Name ?? propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName         = propertyType.GetDeclaringTypeName();
                    propertyOrder                    = dcsDataMember.Order;
                    propertySuppressDefaultAttribute = !dcsDataMember.EmitDefaultValue;
                }
                else
                {
                    var dcsDataMember = propertyInfo.GetDataMember();
                    var alias         = dcsDataMember?.Name;

                    propertyName                    = alias ?? propertyInfo.Name;
                    propertyNameCLSFriendly         = alias ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = alias ?? propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName        = propertyInfo.GetDeclaringTypeName();
                }


                PropertyWriters[i] = new TypePropertyWriter
                                     (
                    propertyType,
                    propertyName,
                    propertyDeclaredTypeName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    propertyOrder,
                    propertySuppressDefaultConfig,
                    propertySuppressDefaultAttribute,
                    propertyInfo.CreateGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    propertyType.GetDefaultValue(),
                    shouldSerialize,
                    shouldSerializeDynamic,
                    propertyType.IsEnum
                                     );
            }

            for (var i = 0; i < fieldNamesLength; i++)
            {
                var fieldInfo = fieldInfos[i];

                string propertyName, propertyNameCLSFriendly, propertyNameLowercaseUnderscore, propertyDeclaredTypeName;
                var    propertyOrder = -1;
                var    propertyType  = fieldInfo.FieldType;
                var    defaultValue  = propertyType.GetDefaultValue();
                var    propertySuppressDefaultConfig = defaultValue != null &&
                                                       propertyType.IsValueType && !propertyType.IsEnum &&
                                                       JsConfig.HasSerializeFn.Contains(propertyType) &&
                                                       !JsConfig.HasIncludeDefaultValue.Contains(propertyType);
                var propertySuppressDefaultAttribute = false;

                var shouldSerialize = GetShouldSerializeMethod(fieldInfo);
                if (isDataContract)
                {
                    var dcsDataMember = fieldInfo.GetDataMember();
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName                     = dcsDataMember.Name ?? fieldInfo.Name;
                    propertyNameCLSFriendly          = dcsDataMember.Name ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore  = dcsDataMember.Name ?? propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName         = fieldInfo.DeclaringType.Name;
                    propertyOrder                    = dcsDataMember.Order;
                    propertySuppressDefaultAttribute = !dcsDataMember.EmitDefaultValue;
                }
                else
                {
                    var dcsDataMember = fieldInfo.GetDataMember();
                    var alias         = dcsDataMember?.Name;
                    propertyName                    = alias ?? fieldInfo.Name;
                    propertyNameCLSFriendly         = alias ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = alias ?? propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName        = fieldInfo.DeclaringType.Name;
                }

                PropertyWriters[i + propertyNamesLength] = new TypePropertyWriter
                                                           (
                    propertyType,
                    propertyName,
                    propertyDeclaredTypeName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    propertyOrder,
                    propertySuppressDefaultConfig,
                    propertySuppressDefaultAttribute,
                    fieldInfo.CreateGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    defaultValue,
                    shouldSerialize,
                    shouldSerializeDynamic,
                    propertyType.IsEnum
                                                           );
            }

            PropertyWriters = PropertyWriters.OrderBy(x => x.propertyOrder).ToArray();
            return(true);
        }
예제 #4
0
        private static bool Init()
        {
            if (!typeof(T).IsClass() && !typeof(T).IsInterface() && !JsConfig.TreatAsRefType(typeof(T)))
            {
                return(false);
            }

            var propertyInfos       = TypeConfig <T> .Properties;
            var fieldInfos          = JsConfig.IncludePublicFields ? TypeConfig <T> .Fields : new FieldInfo[0];
            var propertyNamesLength = propertyInfos.Length;
            var fieldNamesLength    = fieldInfos.Length;

            PropertyWriters = new TypePropertyWriter[propertyNamesLength + fieldNamesLength];

            if (propertyNamesLength + fieldNamesLength == 0 && !JsState.IsWritingDynamic)
            {
                return(typeof(T).IsDto());
            }

            // NOTE: very limited support for DataContractSerialization (DCS)
            //	NOT supporting Serializable
            //	support for DCS is intended for (re)Name of properties and Ignore by NOT having a DataMember present
            var isDataContract = typeof(T).IsDto();

            for (var i = 0; i < propertyNamesLength; i++)
            {
                var propertyInfo = propertyInfos[i];

                string propertyName, propertyNameCLSFriendly, propertyNameLowercaseUnderscore;

                if (isDataContract)
                {
                    var dcsDataMember = propertyInfo.GetDataMember();
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName                    = dcsDataMember.Name ?? propertyInfo.Name;
                    propertyNameCLSFriendly         = dcsDataMember.Name ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = dcsDataMember.Name ?? propertyName.ToLowercaseUnderscore();
                }
                else
                {
                    propertyName                    = propertyInfo.Name;
                    propertyNameCLSFriendly         = propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = propertyName.ToLowercaseUnderscore();
                }

                var propertyType         = propertyInfo.PropertyType;
                var suppressDefaultValue = propertyType.IsValueType() && JsConfig.HasSerializeFn.Contains(propertyType)
                    ? propertyType.GetDefaultValue()
                    : null;

                PropertyWriters[i] = new TypePropertyWriter
                                     (
                    propertyName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    propertyInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    suppressDefaultValue
                                     );
            }

            for (var i = 0; i < fieldNamesLength; i++)
            {
                var fieldInfo = fieldInfos[i];

                string propertyName                    = fieldInfo.Name;
                string propertyNameCLSFriendly         = propertyName.ToCamelCase();
                string propertyNameLowercaseUnderscore = propertyName.ToLowercaseUnderscore();

                var propertyType         = fieldInfo.FieldType;
                var suppressDefaultValue = propertyType.IsValueType() && JsConfig.HasSerializeFn.Contains(propertyType)
                    ? propertyType.GetDefaultValue()
                    : null;

                PropertyWriters[i + propertyNamesLength] = new TypePropertyWriter
                                                           (
                    propertyName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    fieldInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    suppressDefaultValue
                                                           );
            }

            return(true);
        }
예제 #5
0
        /// <summary>Initialises this object.</summary>
        /// <returns>true if it succeeds, false if it fails.</returns>
        private static bool Init()
        {
            if (!typeof(T).IsClass() && !typeof(T).IsInterface() && !JsConfig.TreatAsRefType(typeof(T)))
            {
                return(false);
            }

            var isDataContract      = typeof(T).IsDto();
            var propertyInfos       = TypeConfig <T> .Properties;
            var fieldInfos          = JsConfig.IncludePublicFields || isDataContract ? TypeConfig <T> .Fields : new FieldInfo[0];
            var propertyNamesLength = propertyInfos.Length;
            var fieldNamesLength    = fieldInfos.Length;

            PropertyWriters = new TypePropertyWriter[propertyNamesLength + fieldNamesLength];

            if (propertyNamesLength + fieldNamesLength == 0 && !JsState.IsWritingDynamic)
            {
                return(typeof(T).IsDto());
            }

            // NOTE: very limited support for DataContractSerialization (DCS)
            //	NOT supporting Serializable
            //	support for DCS is intended for (re)Name of properties and Ignore by NOT having a DataMember present

            for (var i = 0; i < propertyNamesLength; i++)
            {
                var propertyInfo = propertyInfos[i];

                string propertyName, propertyNameCLSFriendly, propertyNameLowercaseUnderscore, propertyReflectedName;
                int    propertyOrder = -1;
                var    propertyType  = propertyInfo.PropertyType;
                var    defaultValue  = propertyType.GetDefaultValue();
                bool   propertySuppressDefaultConfig    = defaultValue != null && propertyType.IsValueType() && JsConfig.HasSerializeFn.Contains(propertyType);
                bool   propertySuppressDefaultAttribute = false;
                var    shouldSerialize = GetShouldSerializeMethod(propertyInfo);
                if (isDataContract)
                {
                    var dcsDataMember = propertyInfo.GetDataMember();
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName                    = dcsDataMember.Name ?? propertyInfo.Name;
                    propertyNameCLSFriendly         = dcsDataMember.Name ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = dcsDataMember.Name ?? propertyName.ToLowercaseUnderscore();
                    propertyReflectedName           = dcsDataMember.Name ?? propertyInfo.ReflectedType.Name;

                    // Fields tend to be at topp, push down properties to make it more like common.
                    propertyOrder = dcsDataMember.Order == DataMemberOrderNotSet ? 0 : dcsDataMember.Order;
                    propertySuppressDefaultAttribute = !dcsDataMember.EmitDefaultValue;
                }
                else
                {
                    propertyName                    = propertyInfo.Name;
                    propertyNameCLSFriendly         = propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = propertyName.ToLowercaseUnderscore();
                    propertyReflectedName           = propertyInfo.ReflectedType.Name;
                }


                PropertyWriters[i] = new TypePropertyWriter
                                     (
                    propertyName,
                    propertyReflectedName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    propertyOrder,
                    propertySuppressDefaultConfig,
                    propertySuppressDefaultAttribute,
                    propertyInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    propertyType.GetDefaultValue(),
                    shouldSerialize
                                     );
            }

            for (var i = 0; i < fieldNamesLength; i++)
            {
                var fieldInfo = fieldInfos[i];

                string propertyName, propertyNameCLSFriendly, propertyNameLowercaseUnderscore, propertyReflectedName;
                int    propertyOrder = -1;
                var    propertyType  = fieldInfo.FieldType;
                var    defaultValue  = propertyType.GetDefaultValue();
                bool   propertySuppressDefaultConfig    = defaultValue != null && propertyType.IsValueType() && JsConfig.HasSerializeFn.Contains(propertyType);
                bool   propertySuppressDefaultAttribute = false;
                var    shouldSerialize = GetShouldSerializeMethod(fieldInfo);
                if (isDataContract)
                {
                    var dcsDataMember = fieldInfo.GetDataMember();
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName                     = dcsDataMember.Name ?? fieldInfo.Name;
                    propertyNameCLSFriendly          = dcsDataMember.Name ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore  = dcsDataMember.Name ?? propertyName.ToLowercaseUnderscore();
                    propertyReflectedName            = dcsDataMember.Name ?? fieldInfo.ReflectedType.Name;
                    propertyOrder                    = dcsDataMember.Order;
                    propertySuppressDefaultAttribute = !dcsDataMember.EmitDefaultValue;
                }
                else
                {
                    propertyName                    = fieldInfo.Name;
                    propertyNameCLSFriendly         = propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = propertyName.ToLowercaseUnderscore();
                    propertyReflectedName           = fieldInfo.ReflectedType.Name;
                }

                PropertyWriters[i + propertyNamesLength] = new TypePropertyWriter
                                                           (
                    propertyName,
                    propertyReflectedName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    propertyOrder,
                    propertySuppressDefaultConfig,
                    propertySuppressDefaultAttribute,
                    fieldInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    defaultValue,
                    shouldSerialize
                                                           );
            }
            PropertyWriters = PropertyWriters.OrderBy(x => x.propertyOrder).ToArray();
            return(true);
        }
예제 #6
0
        private static bool Init()
        {
            if (!typeof(T).IsClass() && !typeof(T).IsInterface() && !JsConfig.TreatAsRefType(typeof(T)))
            {
                return(false);
            }

            var propertyInfos       = TypeConfig <T> .Properties;
            var fieldInfos          = JsConfig.IncludePublicFields ? TypeConfig <T> .Fields : new FieldInfo[0];
            var propertyNamesLength = propertyInfos.Length;
            var fieldNamesLength    = fieldInfos.Length;

            PropertyWriters = new TypePropertyWriter[propertyNamesLength + fieldNamesLength];

            if (propertyNamesLength + fieldNamesLength == 0 && !JsState.IsWritingDynamic)
            {
                return(typeof(T).IsDto());
            }


#if PLATFORM_USE_SERIALIZATION_DLL
            // NOTE: very limited support for DataContractSerialization (DCS)
            //	NOT supporting Serializable
            //	support for DCS is intended for (re)Name of properties and Ignore by NOT having a DataMember present
            var isDataContract = typeof(T).IsDto();
#endif

            for (var i = 0; i < propertyNamesLength; i++)
            {
                var propertyInfo = propertyInfos[i];

                string propertyName, propertyNameCLSFriendly, propertyNameLowercaseUnderscore, propertyDeclaredTypeName;


#if PLATFORM_USE_SERIALIZATION_DLL
                int propertyOrder = -1;

                if (!isDataContract)
                {
                    propertyOrder = propertyInfo.MetadataToken;
                }
#else
                int propertyOrder = propertyInfo.MetadataToken;                   // use  MetadataToken as order .
#endif


                var  propertyType = propertyInfo.PropertyType;
                var  defaultValue = propertyType.GetDefaultValue();
                bool propertySuppressDefaultConfig    = defaultValue != null && propertyType.IsValueType() && JsConfig.HasSerializeFn.Contains(propertyType);
                bool propertySuppressDefaultAttribute = false;
#if NETFX_CORE
                var shouldSerialize = (Func <T, bool>)null;
#else
                var shouldSerialize = GetShouldSerializeMethod(propertyInfo);
#endif


#if PLATFORM_USE_SERIALIZATION_DLL
                if (isDataContract)
                {
                    var dcsDataMember = propertyInfo.GetDataMember();
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName                     = dcsDataMember.Name ?? propertyInfo.Name;
                    propertyNameCLSFriendly          = dcsDataMember.Name ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore  = dcsDataMember.Name ?? propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName         = propertyType.GetDeclaringTypeName();
                    propertyOrder                    = dcsDataMember.Order;
                    propertySuppressDefaultAttribute = !dcsDataMember.EmitDefaultValue;
                }
                else
#endif
                {
                    propertyName                    = propertyInfo.Name;
                    propertyNameCLSFriendly         = propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName        = propertyInfo.GetDeclaringTypeName();
                }


                PropertyWriters[i] = new TypePropertyWriter
                                     (
                    propertyName,
                    propertyDeclaredTypeName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    propertyOrder,
                    propertySuppressDefaultConfig,
                    propertySuppressDefaultAttribute,
                    propertyInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    propertyType.GetDefaultValue(),
                    shouldSerialize
                                     );
            }

            for (var i = 0; i < fieldNamesLength; i++)
            {
                var fieldInfo = fieldInfos[i];

                string propertyName, propertyNameCLSFriendly, propertyNameLowercaseUnderscore, propertyDeclaredTypeName;


#if PLATFORM_USE_SERIALIZATION_DLL
                int propertyOrder = -1;

                if (!isDataContract)
                {
                    propertyOrder = fieldInfo.MetadataToken;
                }
#else
                int propertyOrder = fieldInfo.MetadataToken;                   // use  MetadataToken as order .
#endif



                var  propertyType = fieldInfo.FieldType;
                var  defaultValue = propertyType.GetDefaultValue();
                bool propertySuppressDefaultConfig    = defaultValue != null && propertyType.IsValueType() && JsConfig.HasSerializeFn.Contains(propertyType);
                bool propertySuppressDefaultAttribute = false;
#if NETFX_CORE
                var shouldSerialize = (Func <T, bool>)null;
#else
                var shouldSerialize = GetShouldSerializeMethod(fieldInfo);
#endif



#if PLATFORM_USE_SERIALIZATION_DLL
                if (isDataContract)
                {
                    var dcsDataMember = fieldInfo.GetDataMember();
                    if (dcsDataMember == null)
                    {
                        continue;
                    }

                    propertyName                     = dcsDataMember.Name ?? fieldInfo.Name;
                    propertyNameCLSFriendly          = dcsDataMember.Name ?? propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore  = dcsDataMember.Name ?? propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName         = fieldInfo.DeclaringType.Name;
                    propertyOrder                    = dcsDataMember.Order;
                    propertySuppressDefaultAttribute = !dcsDataMember.EmitDefaultValue;
                }
                else
#endif

                {
                    propertyName                    = fieldInfo.Name;
                    propertyNameCLSFriendly         = propertyName.ToCamelCase();
                    propertyNameLowercaseUnderscore = propertyName.ToLowercaseUnderscore();
                    propertyDeclaredTypeName        = fieldInfo.DeclaringType.Name;
                }

                PropertyWriters[i + propertyNamesLength] = new TypePropertyWriter
                                                           (
                    propertyName,
                    propertyDeclaredTypeName,
                    propertyNameCLSFriendly,
                    propertyNameLowercaseUnderscore,
                    propertyOrder,
                    propertySuppressDefaultConfig,
                    propertySuppressDefaultAttribute,
                    fieldInfo.GetValueGetter <T>(),
                    Serializer.GetWriteFn(propertyType),
                    defaultValue,
                    shouldSerialize
                                                           );
            }

#if  PLATFORM_USE_AOT
            List <TypePropertyWriter> results = new  List <TypePropertyWriter>  (PropertyWriters);



            // foreach( TypePropertyWriter item in  PropertyWriters )
            //{

            //  results.Add( item );

            //}


            results.Sort(typePropertyWriterComparerDefault);

            PropertyWriters = results.ToArray( );


            return(true);
#else
            PropertyWriters = PropertyWriters.OrderBy(x => x.propertyOrder).ToArray();

            return(true);
#endif
        }