internal static List<Field> GetRuntimeSerializableFields(Type _objectType, RuntimeSerializableAttribute _runtimeSerializableAttr)
        {
            List<Field> 			_serializableFields				= null;

            lock (typeMemberInfoCache)
            {
                // If cached value doesnt exist, then use Reflection to get list of RuntimeSerializable fields
                if (!typeMemberInfoCache.TryGetValue(_objectType, out _serializableFields))
                {
                    bool 			_serializeAllPublicFields 		= false;
                    bool 			_serializeAllNonPublicFields	= false;

                    if (_runtimeSerializableAttr != null)
                    {
                        _serializeAllPublicFields					= _runtimeSerializableAttr.SerializeAllPublicVariables;
                        _serializeAllNonPublicFields				= _runtimeSerializableAttr.SerializeAllNonPublicVariables;
                    }

                    // Using reflection fetch all the fields
                    FieldInfo[] 	_publicFields					= _objectType.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static);
                    FieldInfo[] 	_nonPublicFields				= _objectType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static);

                    // List holds both public and non-public fields which needs to be serialised
                    _serializableFields								= new List<Field>(_publicFields.Length + _nonPublicFields.Length);

                    FilterOutNonSerializableFields(_publicFields, 		_serializeAllPublicFields, 		ref _serializableFields);
                    FilterOutNonSerializableFields(_nonPublicFields, 	_serializeAllNonPublicFields, 	ref _serializableFields);

                    // Cache member
                    typeMemberInfoCache[_objectType]				= _serializableFields;
                }
            }

            return _serializableFields;
        }
Ejemplo n.º 2
0
        internal static bool IsRuntimeSerializableObject(Type _objectType)
        {
            // Check if type supports member based serialization
            RuntimeSerializableAttribute _serializableAttr = GetRuntimeSerializableAttribute(_objectType);

            return(_serializableAttr != null);
        }
Ejemplo n.º 3
0
        internal static List <Field> GetRuntimeSerializableFields(Type _objectType, RuntimeSerializableAttribute _runtimeSerializableAttr)
        {
            List <Field> _serializableFields = null;

            lock (typeMemberInfoCache)
            {
                // If cached value doesnt exist, then use Reflection to get list of RuntimeSerializable fields
                if (!typeMemberInfoCache.TryGetValue(_objectType, out _serializableFields))
                {
                    bool _serializeAllPublicFields    = false;
                    bool _serializeAllNonPublicFields = false;

                    if (_runtimeSerializableAttr != null)
                    {
                        _serializeAllPublicFields    = _runtimeSerializableAttr.SerializeAllPublicVariables;
                        _serializeAllNonPublicFields = _runtimeSerializableAttr.SerializeAllNonPublicVariables;
                    }

                    // Using reflection fetch all the fields
                    FieldInfo[] _publicFields    = _objectType.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static);
                    FieldInfo[] _nonPublicFields = _objectType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static);

                    // List holds both public and non-public fields which needs to be serialised
                    _serializableFields = new List <Field>(_publicFields.Length + _nonPublicFields.Length);

                    FilterOutNonSerializableFields(_publicFields, _serializeAllPublicFields, ref _serializableFields);
                    FilterOutNonSerializableFields(_nonPublicFields, _serializeAllNonPublicFields, ref _serializableFields);

                    // Cache member
                    typeMemberInfoCache[_objectType] = _serializableFields;
                }
            }

            return(_serializableFields);
        }
Ejemplo n.º 4
0
        internal static RuntimeSerializableAttribute GetRuntimeSerializableAttribute(Type _objectType)
        {
            RuntimeSerializableAttribute _serializableAttr = null;

            lock (serializableAttributeCache)
            {
                // If cached value doesnt exist, then check if object implements RuntimeSerializableAttribute
                if (!serializableAttributeCache.TryGetValue(_objectType, out _serializableAttr))
                {
                    _serializableAttr = _objectType.GetAttribute <RuntimeSerializableAttribute>(false);

                    // Add it to cache collection
                    serializableAttributeCache[_objectType] = _serializableAttr;
                }
            }

            return(_serializableAttr);
        }
Ejemplo n.º 5
0
        private void GetObjectData(object _object, ref RuntimeSerializationInfo _serializationInfo)
        {
            Type _objectType = _serializationInfo.ObjectType;
            RuntimeSerializableAttribute _serializableAttr = SerializationTypeUtil.GetRuntimeSerializableAttribute(_objectType);

            if (_serializableAttr != null)
            {
                // Serialization is controlled by user
                if (typeof(IRuntimeSerializable).IsAssignableFrom(_objectType))
                {
                    ((IRuntimeSerializable)_object).WriteSerializationData(_serializationInfo);
                }
                // Serialization using Reflection
                else
                {
                    Type _curObjectType = _objectType;

                    while (true)
                    {
                        // Gather information about all the fields to be deserialized
                        if (_serializableAttr != null)
                        {
                            GetObjectDataUsingReflection(_object, _curObjectType, ref _serializationInfo, _serializableAttr);
                        }

                        // Tranverse to object's base and check for termiation condition
                        _curObjectType = _curObjectType.BaseType;

                        if (_curObjectType == null)
                        {
                            break;
                        }

                        // Get base type's attribute
                        _serializableAttr = SerializationTypeUtil.GetRuntimeSerializableAttribute(_curObjectType);
                    }
                }

                return;
            }
        }
Ejemplo n.º 6
0
        private object CreateInstance(RSBinaryReader _binaryReader, RuntimeSerializationInfo _serilizationInfo)
        {
            Type _objectType = _serilizationInfo.ObjectType;
            RuntimeSerializableAttribute _serializableAttr = SerializationTypeUtil.GetRuntimeSerializableAttribute(_objectType);

            if (_serializableAttr != null)
            {
                if (typeof(IRuntimeSerializableActivator).IsAssignableFrom(_objectType))
                {
                    MethodInfo _staticInstanceCreator = _objectType.GetMethod("CreateInstance", BindingFlags.Public | BindingFlags.Static);

                    if (_staticInstanceCreator != null)
                    {
                        return(_staticInstanceCreator.Invoke(null, new object[] { _serilizationInfo }));
                    }
                }
            }

            // Fallback condition
            return(Activator.CreateInstance(_objectType));
        }
        private object SetObjectDataUsingReflection(object _object, Type _objectType, RuntimeSerializationInfo _serializationInfo, RuntimeSerializableAttribute _serializableAttr)
        {
            List<Field>		_serializableFields			= SerializationTypeUtil.GetRuntimeSerializableFields(_objectType, _serializableAttr);
            int 			_serializableFieldCount 	= _serializableFields.Count;

            // Iterate through all serialisable fields
            for (int _iter = 0; _iter < _serializableFieldCount; _iter++)
            {
                Field 		_curField					= _serializableFields[_iter];
                FieldInfo	_curFieldInfo				= _curField.Info;
                object 		_curFieldValue				= _serializationInfo.GetValue(_curFieldInfo.Name, _curFieldInfo.FieldType, _curField.IsObjectInitializer);

                // Set this new value
                if (_curFieldInfo.IsStatic)
                    _curFieldInfo.SetValue(null, 	_curFieldValue);
                else
                    _curFieldInfo.SetValue(_object, _curFieldValue);
            }

            return _object;
        }
Ejemplo n.º 8
0
        private void GetObjectDataUsingReflection(object _object, Type _objectType, ref RuntimeSerializationInfo _serializationInfo, RuntimeSerializableAttribute _serializableAttr)
        {
            List <Field> _serializableFields     = SerializationTypeUtil.GetRuntimeSerializableFields(_objectType, _serializableAttr);
            int          _serializableFieldCount = _serializableFields.Count;

            // Iterate through all serialisable fields
            for (int _iter = 0; _iter < _serializableFieldCount; _iter++)
            {
                Field     _curField     = _serializableFields[_iter];
                FieldInfo _curFieldInfo = _curField.Info;
                object    _curFieldValue;

                if (_curFieldInfo.IsStatic)
                {
                    _curFieldValue = _curFieldInfo.GetValue(null);
                }
                else
                {
                    _curFieldValue = _curFieldInfo.GetValue(_object);
                }

                // Add this field info
                _serializationInfo.AddValue(_curFieldInfo.Name, _curFieldValue, _curFieldInfo.FieldType, _curField.IsObjectInitializer);
            }
        }