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