internal eTypeTag GetTypeTag(Type _objectType)
        {
            eTypeTag _typeTag = eTypeTag.UNSUPPORTED;

            if (_objectType.IsValueType)
            {
                if (SerializationTypeUtil.IsPrimitive(_objectType))
                {
                    _typeTag = eTypeTag.PRIMITIVE;
                }
                else if (SerializationTypeUtil.IsRuntimeSerializableObject(_objectType))
                {
                    _typeTag = eTypeTag.STRUCT;
                }
            }
            else if (_objectType == typeof(string))
            {
                _typeTag = eTypeTag.STRING;
            }
            else if (_objectType.IsClass)
            {
                if (SerializationTypeUtil.IsRuntimeSerializableObject(_objectType))
                {
                    _typeTag = eTypeTag.CLASS;
                }
            }

            return(_typeTag);
        }
예제 #2
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);
            }
        }
예제 #3
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;
            }
        }
예제 #4
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));
        }
        internal void RegisterType(Type _type, out UInt32 _typeID, out bool _newType)
        {
            // TypeCode is used as type id for primitive's and string's
            if (SerializationTypeUtil.IsPrimitive(_type) || _type == typeof(string))
            {
                _typeID  = (UInt32)Type.GetTypeCode(_type);
                _newType = false;
                return;
            }

            // Check if type was already registered
            if (m_cachedObjectTypes.TryGetValue(_type, out _typeID))
            {
                _newType = false;
                return;
            }

            // Generate type identifier which is used later for mapping
            _newType = true;
            _typeID  = m_typeCounter++;

            // Add type info to cache
            m_cachedObjectTypes.Add(_type, _typeID);
        }