internal virtual void Reset()
        {
            // Resetting object reference cache
            ObjectReferenceCache.Clear();

            // Resetting type metadata
            TypeMetadata.Reset();
        }
        private void RegisterObject(object _object, out UInt32 _referenceID, out bool _firstTime)
        {
            // Check if this object already exists
            if (ObjectReferenceCache.TryGetValue(_object, out _referenceID))
            {
                _firstTime = false;
                return;
            }

            // Cache this new object
            _referenceID = ObjectReferenceCounter++;
            _firstTime   = true;
            ObjectReferenceCache.Add(_object, _referenceID);
        }
        private object ReadClassTypeValue(RSBinaryReader _binaryReader, out Type _objectType, object _object)
        {
            // Read properties
            UInt32 _typeID            = _binaryReader.ReadUInt32();
            UInt32 _objectReferenceID = _binaryReader.ReadUInt32();

            // Get object type
            _objectType = TypeMetadata.GetType(_typeID);

            // Read object refernece
            Dictionary <string, RuntimeSerializationEntry> _initValuesContainer = new Dictionary <string, RuntimeSerializationEntry>();
            Dictionary <string, RuntimeSerializationEntry> _serValuesContainer  = new Dictionary <string, RuntimeSerializationEntry>();
            RuntimeSerializationInfo _serializationInfo = new RuntimeSerializationInfo(_objectType, _initValuesContainer, _serValuesContainer);

            // Read initializers and create instance, if required
            ReadSerializationContainer(_binaryReader, ref _initValuesContainer);

            if (_object == null)
            {
                _object = CreateInstance(_binaryReader, _serializationInfo);
            }

            ObjectReferenceCache.Add(_object, _objectReferenceID);

            // Read properties
            ReadSerializationContainer(_binaryReader, ref _serValuesContainer);

            // Set object value
            _object = SetObjectData(_object, _serializationInfo);

            // Trigger deserialization callback
            if (typeof(IRuntimeSerializationCallback).IsAssignableFrom(_objectType))
            {
                ((IRuntimeSerializationCallback)_object).OnAfterRuntimeDeserialize();
            }

            return(_object);
        }
        private object ReadObjectReferenceValue(RSBinaryReader _binaryReader, out Type _objectType)
        {
            UInt32 _objectReferenceID = _binaryReader.ReadUInt32();
            object _object;

            // Find object using reference ID
            Dictionary <object, UInt32> .Enumerator _dictEnumerator = ObjectReferenceCache.GetEnumerator();

            while (_dictEnumerator.MoveNext())
            {
                KeyValuePair <object, UInt32> _keyValuePair = _dictEnumerator.Current;
                UInt32 _currentReferenceID = _keyValuePair.Value;

                if (_currentReferenceID == _objectReferenceID)
                {
                    _object     = _keyValuePair.Key;
                    _objectType = _object.GetType();

                    return(_object);
                }
            }

            throw new Exception(string.Format("[RS] Object Reference not found for ID={0}.", _objectReferenceID));
        }