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); }
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); } }
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; } }
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); }