예제 #1
0
        static SerializedContainerMetadata GetSerializedContainerMetadata(UnsafeObjectView view)
        {
            var metadata = default(SerializedContainerMetadata);

            foreach (var member in view)
            {
                var name = member.Key().AsStringView();

                if (name.Length() == 0 || name[0] != '$')
                {
                    break;
                }

                if (name.Equals(k_SerializedId))
                {
                    metadata.HasSerializedId = true;
                    metadata.SerializedId    = member.Value().AsInt32();
                }

                if (name.Equals(k_SerializedReferenceKey))
                {
                    metadata.IsSerializedReference = true;
                    metadata.SerializedId          = member.Value().AsInt32();
                }

                metadata.HasSerializedTypeInfo |= name.Equals(k_SerializedTypeKey);
                metadata.HasSerializedVersion  |= name.Equals(k_SerializedVersionKey);
                metadata.HasElements           |= name.Equals(k_SerializedElementsKey);
            }

            return(metadata);
        }
        public bool TryMigrate <TValue>(UnsafeObjectView view, out TValue value, JsonPropertyReader reader, List <DeserializationEvent> events)
        {
            var migration = GetMigrationForType <TValue>(out var version);

            if (null == migration)
            {
                value = default;
                return(false);
            }

            var serializedVersion = 0;

            if (view.TryGetValue(JsonPropertyVisitor.k_SerializedVersionKey, out var serializedVersionView))
            {
                if (serializedVersionView.Type != TokenType.Primitive)
                {
                    events.Add(new DeserializationEvent(EventType.Exception, new Exception($"An error occured while deserializing Type=[{typeof(TValue)}]. Property=[{JsonPropertyVisitor.k_SerializedVersionKey}] is expected to be an int value.")));
                    value = default;
                    return(false);
                }

                serializedVersion = serializedVersionView.AsInt32();

                if (version == serializedVersion)
                {
                    value = default;
                    return(false);
                }
            }

            var context = new JsonMigrationContext(serializedVersion, view.AsSafe(), typeof(TValue), UserData, reader);

            switch (migration)
            {
            case IJsonMigration <TValue> typed:
                value = typed.Migrate(context);
                break;

            case Contravariant.IJsonMigration <TValue> typedContravariant:
                value = (TValue)typedContravariant.Migrate(context);
                break;

            default:
                throw new Exception("An internal error has occured.");
            }

            return(true);
        }
예제 #3
0
        protected virtual void AcceptProperty <TContainer>(ref TContainer container, UnsafeObjectView view, IProperty <TContainer> property)
        {
            if (view.TryGetValue(property.Name, out var value))
            {
                using (CreatePropertyScope(property))
                    using (CreateViewScope(value))
                    {
                        ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                    }

                if (container is IFormatVersion formatVersion)
                {
                    formatVersion.CheckFormatVersion();
                }

                return;
            }

            foreach (var attribute in property.GetAttributes <FormerNameAttribute>())
            {
                if (view.TryGetValue(attribute.OldName, out value))
                {
                    using (CreatePropertyScope(property))
                        using (CreateViewScope(value))
                        {
                            ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                        }

                    return;
                }
            }

            foreach (var attribute in property.GetAttributes <UnityEngine.Serialization.FormerlySerializedAsAttribute>())
            {
                if (view.TryGetValue(attribute.oldName, out value))
                {
                    using (CreatePropertyScope(property))
                        using (CreateViewScope(value))
                        {
                            ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                        }

                    return;
                }
            }
        }
예제 #4
0
        static SerializedContainerMetadata GetSerializedContainerMetadata(UnsafeObjectView view)
        {
            var metadata = default(SerializedContainerMetadata);

            foreach (var member in view)
            {
                var name = member.Key().AsStringView();

                if (name.Length() == 0 || name[0] != '$')
                {
                    break;
                }

                metadata.HasElements |= name.Equals(k_SerializedElementsKey);
            }

            return(metadata);
        }
예제 #5
0
        void AcceptProperty <TContainer>(ref TContainer container, UnsafeObjectView view, IProperty <TContainer> property)
        {
            if (view.TryGetValue(property.Name, out var value))
            {
                using (CreatePropertyScope(property))
                    using (CreateViewScope(value))
                    {
                        property.Accept(this, ref container);
                    }

                return;
            }

            foreach (var attribute in property.GetAttributes <FormerNameAttribute>())
            {
                if (view.TryGetValue(attribute.OldName, out value))
                {
                    using (CreatePropertyScope(property))
                        using (CreateViewScope(value))
                        {
                            property.Accept(this, ref container);
                        }

                    return;
                }
            }

            foreach (var attribute in property.GetAttributes <UnityEngine.Serialization.FormerlySerializedAsAttribute>())
            {
                if (view.TryGetValue(attribute.oldName, out value))
                {
                    using (CreatePropertyScope(property))
                        using (CreateViewScope(value))
                        {
                            property.Accept(this, ref container);
                        }

                    return;
                }
            }
        }
        protected override void AcceptProperty <TContainer>(ref TContainer container, UnsafeObjectView view, IProperty <TContainer> property)
        {
            var name = property.Name;

            if (view.TryGetValue(name, out var value))
            {
                using (CreateViewScope(value))
                {
                    if (container is GameObjectContainer gameObjectContainer)
                    {
                        gameObjectContainer.Parent = m_Parent;
                        m_GameObjectContainer      = gameObjectContainer;
                        // TODO: Detect by type?
                        if (name == GameObjectContainer.PrefabMetadataProperty)
                        {
                            ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                            return;
                        }

                        if (name == GameObjectContainer.ComponentsProperty)
                        {
                            var gameObject = gameObjectContainer.GameObject;
                            ((IPropertyAccept <TContainer>)property).Accept(
                                new ComponentVisitor(gameObject, m_View, m_Events, m_SerializationMetadata),
                                ref container);

                            var prefabMetadata = gameObjectContainer.PrefabMetadataContainer;
                            if (prefabMetadata != null)
                            {
                                gameObjectContainer.FinalizePrefab(prefabMetadata, m_SerializationMetadata);
                                m_PrefabRoot = null;
                            }

                            return;
                        }

                        if (name == GameObjectContainer.ChildrenProperty)
                        {
                            ((IPropertyAccept <TContainer>)property).Accept(
                                new GameObjectVisitor(m_View, m_Events, m_SerializationMetadata,
                                                      gameObjectContainer.GameObject.transform, m_PrefabRoot, m_Parameters),
                                ref container);

                            return;
                        }
                    }
                    else if (container is RuntimeAddedComponent addedComponent)
                    {
                        if (name == RuntimeAddedComponent.ComponentFieldName)
                        {
                            var target = m_PrefabRoot.GameObject.transform.GetTransformAtPath(addedComponent.TransformPath);
                            ((IPropertyAccept <TContainer>)property).Accept(
                                new ComponentVisitor(target.gameObject, m_View, m_Events, m_SerializationMetadata),
                                ref container);

                            return;
                        }
                    }
                    else if (container is RuntimeAddedGameObject addedGameObject)
                    {
                        if (name == nameof(addedGameObject.GameObject))
                        {
                            var parent = m_PrefabRoot.GameObject.transform.GetTransformAtPath(addedGameObject.TransformPath);
                            ((IPropertyAccept <TContainer>)property).Accept(
                                new GameObjectVisitor(m_View, m_Events, m_SerializationMetadata, parent, m_PrefabRoot, m_Parameters),
                                ref container);

                            return;
                        }
                    }
                    else if (container is PrefabMetadataContainer prefabMetadataContainer)
                    {
                        if (name == PrefabMetadataContainer.GuidFieldName)
                        {
                            m_PrefabRoot = m_GameObjectContainer;
                            ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                            m_PrefabRoot.InstantiatePrefab(prefabMetadataContainer.Guid, m_SerializationMetadata.AssetPack);
                            return;
                        }
                    }

                    ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                }
            }
        }
예제 #7
0
        protected override void AcceptProperty <TContainer>(ref TContainer container, UnsafeObjectView view, IProperty <TContainer> property)
        {
            var name = property.Name;

            if (view.TryGetValue(name, out var value))
            {
                using (CreateViewScope(value))
                {
                    if (property is Property <TContainer, List <GameObjectContainer> > )
                    {
                        ((IPropertyAccept <TContainer>)property).Accept(
                            new GameObjectVisitor(m_View, m_Events, m_SerializationMetadata, m_SceneRoot, null, m_Parameters),
                            ref container);
                    }
                    else
                    {
                        ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                    }
                }
            }
        }