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; } }
internal void WriteTypeTag(eTypeTag _tag) { Write((byte)_tag); }