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; }
internal static bool IsRuntimeSerializableObject(Type _objectType) { // Check if type supports member based serialization RuntimeSerializableAttribute _serializableAttr = GetRuntimeSerializableAttribute(_objectType); return(_serializableAttr != null); }
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); }
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); }
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)); }
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; }
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); } }