/// <summary>
        /// Reads the specified <see cref="SerializedValueView"/> in to the given reference.
        /// </summary>
        /// <param name="value">The existing reference to read in to.</param>
        /// <param name="view">The serialized value.</param>
        /// <typeparam name="TValue">The value type.</typeparam>
        public void Read <TValue>(ref TValue value, SerializedValueView view)
        {
            switch (view.Type)
            {
            case TokenType.String:
            {
                TypeConversion.TryConvert(view.AsStringView().ToString(), out value);
                break;
            }

            case TokenType.Primitive:
            {
                var p = view.AsPrimitiveView();

                if (p.IsIntegral())
                {
                    if (p.IsSigned())
                    {
                        TypeConversion.TryConvert(p.AsInt64(), out value);
                    }
                    else
                    {
                        TypeConversion.TryConvert(p.AsUInt64(), out value);
                    }
                }
                else if (p.IsDecimal() || p.IsInfinity() || p.IsNaN())
                {
                    TypeConversion.TryConvert(p.AsFloat(), out value);
                }
                else if (p.IsBoolean())
                {
                    TypeConversion.TryConvert(p.AsBoolean(), out value);
                }
                else if (p.IsNull())
                {
                    value = default;
                }

                break;
            }

            case TokenType.Object:
            case TokenType.Array:
            {
                var serializedType = !RuntimeTypeInfoCache <TValue> .IsAbstractOrInterface
                        ? typeof(TValue)
                        : null;

                using (m_Visitor.CreateSerializedTypeScope(serializedType))
                    using (m_Visitor.CreateViewScope(view.AsUnsafe()))
                        using (m_Visitor.CreateDisableRootMigrationScope(true))
                        {
                            var container = new PropertyWrapper <TValue>(value);
                            PropertyContainer.Visit(ref container, m_Visitor, out _);
                            value = container.Value;
                        }

                break;
            }

            default:
                throw new ArgumentOutOfRangeException();
            }
        }