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);
        }
        internal override object ReadObjectValue(RSBinaryReader _binaryReader, out Type _objectType, object _object = null)
        {
            BinaryElement _curBinaryElement;

            while ((_curBinaryElement = _binaryReader.ReadBinaryElement()) != BinaryElement.OBJECT_DATA)
            {
                TypeMetadata.ReadTypeMetaData(_binaryReader, _curBinaryElement);
            }

            if (_curBinaryElement != BinaryElement.OBJECT_DATA)
            {
                throw new Exception(string.Format("[RS] Parsing error. BinaryElement={0}.", _curBinaryElement));
            }

            // Deserialize based on value
            eTypeTag _typeTag     = _binaryReader.ReadTypeTag();
            object   _objectValue = null;

            switch (_typeTag)
            {
            case eTypeTag.NULL:
            case eTypeTag.UNSUPPORTED:
                _objectType  = null;
                _objectValue = null;
                break;

            case eTypeTag.PRIMITIVE:
                _objectValue = ReadPrimitiveTypeValue(_binaryReader, out _objectType);
                break;

            case eTypeTag.STRUCT:
                _objectValue = ReadStructTypeValue(_binaryReader, out _objectType, _object);
                break;

            case eTypeTag.STRING:
                _objectValue = ReadStringTypeValue(_binaryReader, out _objectType);
                break;

            case eTypeTag.CLASS:
                _objectValue = ReadClassTypeValue(_binaryReader, out _objectType, _object);
                break;

            case eTypeTag.OBJECT_REFERENCE:
                _objectValue = ReadObjectReferenceValue(_binaryReader, out _objectType);
                break;

            default:
                throw new Exception(string.Format("[RS] Unsupported type tag{0}. For more supported types, Purchase full version http://u3d.as/g8b", _typeTag));
            }

            return(_objectValue);
        }
        internal override void WriteObjectValue(RSBinaryWriter _binaryWriter, object _object)
        {
            if (_object == null || _object.Equals(null))
            {
                WriteUnsupportedTypeValue(_binaryWriter, eTypeTag.NULL);
                return;
            }

            // Handle serialization based on object type tag
            Type     _objectType = _object.GetType();
            eTypeTag _typeTag    = TypeMetadata.GetTypeTag(_objectType);

            switch (_typeTag)
            {
            case eTypeTag.UNSUPPORTED:
                Debug.LogWarning(string.Format("[RS] Serialization isnt supported for type={0}.", _objectType));
                WriteUnsupportedTypeValue(_binaryWriter, _typeTag);
                break;

            case eTypeTag.PRIMITIVE:
                WritePrimitiveTypeValue(_binaryWriter, _object, _objectType);
                break;

            case eTypeTag.STRUCT:
                WriteStructTypeValue(_binaryWriter, _object, _objectType);
                break;

            case  eTypeTag.STRING:
                WriteStringTypeValue(_binaryWriter, _object, _objectType);
                break;

            case eTypeTag.CLASS:
                WriteObjectReferenceTypeValue(_binaryWriter, _object, _objectType, _typeTag);
                break;

            default:
                Debug.LogWarning(string.Format("[RS] Unknown type={0}.", _typeTag));
                break;
            }
        }
 private void WriteUnsupportedTypeValue(RSBinaryWriter _binaryWriter, eTypeTag _typeTag)
 {
     _binaryWriter.WriteBinaryElement(BinaryElement.OBJECT_DATA);
     _binaryWriter.WriteTypeTag(_typeTag);
 }
        private void WriteObjectReferenceTypeValue(RSBinaryWriter _binaryWriter, object _object, Type _objectType, eTypeTag _typeTag)
        {
            // Check if this object exists in object reference cache
            bool   _firstTime;
            UInt32 _objectReferenceID;

            RegisterObject(_object, out _objectReferenceID, out _firstTime);

            if (_firstTime)
            {
                if (_typeTag == eTypeTag.CLASS)
                {
                    WriteClassTypeValue(_binaryWriter, _object, _objectType, _objectReferenceID);
                    return;
                }
            }
            else
            {
                _binaryWriter.WriteBinaryElement(BinaryElement.OBJECT_DATA);
                _binaryWriter.WriteTypeTag(eTypeTag.OBJECT_REFERENCE);
                _binaryWriter.Write(_objectReferenceID);
                return;
            }
        }
 private void WriteUnsupportedTypeValue(RSBinaryWriter _binaryWriter, eTypeTag _typeTag)
 {
     _binaryWriter.WriteBinaryElement(BinaryElement.OBJECT_DATA);
     _binaryWriter.WriteTypeTag(_typeTag);
 }
        private void WriteObjectReferenceTypeValue(RSBinaryWriter _binaryWriter, object _object, Type _objectType, eTypeTag _typeTag)
        {
            // Check if this object exists in object reference cache
            bool 	_firstTime;
            UInt32 	_objectReferenceID;

            RegisterObject(_object, out _objectReferenceID, out _firstTime);

            if (_firstTime)
            {
                if (_typeTag == eTypeTag.CLASS)
                {
                    WriteClassTypeValue(_binaryWriter, _object, _objectType, _objectReferenceID);
                    return;
                }
            }
            else
            {
                _binaryWriter.WriteBinaryElement(BinaryElement.OBJECT_DATA);
                _binaryWriter.WriteTypeTag(eTypeTag.OBJECT_REFERENCE);
                _binaryWriter.Write(_objectReferenceID);
                return;
            }
        }
Beispiel #8
0
 internal void WriteTypeTag(eTypeTag _tag)
 {
     Write((byte)_tag);
 }
 internal void WriteTypeTag(eTypeTag _tag)
 {
     Write((byte)_tag);
 }