/// <summary>
        /// Serialize the given object at the current indent level.  The path to the object is represented by
        /// currentPath such as "this.name", etc.  This is an internal method that can be called recursively.
        /// </summary>
        /// <param name="value">the object to serialize</param>
        /// <param name="currentPath">the current path for reference writing</param>
        public Expression Serialize(object value, JsonPath currentPath, IJsonTypeConverter converter)
        {
            if (value == null)
            {
                return(new NullExpression());
            }
            else
            {
                IExpressionHandler objHandler;
                bool isReferencable = _config.IsReferenceableType(value.GetType());
                if (converter != null)
                {
                    TypeConverterExpressionHandler converterHandler = (TypeConverterExpressionHandler)_config.ExpressionHandlers.Find(typeof(TypeConverterExpressionHandler));
                    isReferencable = converterHandler.IsReferenceable(value, converter);
                    objHandler     = converterHandler;
                }
                else
                {
                    objHandler     = _config.ExpressionHandlers.GetHandler(value);
                    isReferencable = objHandler.IsReferenceable(value);
                }

                if (isReferencable)
                {
                    Expression expr = HandleReference(value, currentPath);
                    if (expr != null)
                    {
                        return(expr);
                    }
                }

                ISerializationCallback callback = value as ISerializationCallback;
                if (callback != null)
                {
                    callback.OnBeforeSerialization();
                }

                try
                {
                    if (converter != null)
                    {
                        return(((TypeConverterExpressionHandler)objHandler).GetExpression(value, converter, currentPath, this));
                    }
                    else
                    {
                        SetCanReference(value);
                        return(objHandler.GetExpression(value, currentPath, this));
                    }
                }
                finally
                {
                    if (callback != null)
                    {
                        callback.OnAfterSerialization();
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Serialize the given object at the current indent level.  The path to the object is represented by
        /// currentPath such as "this.name", etc.  This is an internal method that can be called recursively.
        /// </summary>
        /// <param name="value">the object to serialize</param>
        /// <param name="currentPath">the current path for reference writing</param>
        public Expression Serialize(object value, JsonPath currentPath, IJsonTypeConverter converter)
        {
            if (value == null)
            {
                return(new NullExpression());
            }
            else
            {
                Expression expr = HandleReference(value, currentPath);
                if (expr != null)
                {
                    return(expr);
                }

                ISerializationCallback callback = value as ISerializationCallback;
                if (callback != null)
                {
                    callback.OnBeforeSerialization();
                }

                try
                {
                    //TODO: this is too early for converters
                    SetCanReference(value);    // regular object, can reference at any time
                    IExpressionHandler objHandler;
                    if (converter != null)
                    {
                        TypeConverterExpressionHandler converterHandler = (TypeConverterExpressionHandler)_context.ExpressionHandlers.Find(typeof(TypeConverterExpressionHandler));
                        //TODO: make sure it exists
                        return(converterHandler.GetExpression(value, converter, currentPath, this));
                    }
                    objHandler = _context.ExpressionHandlers.GetHandler(value);
                    return(objHandler.GetExpression(value, currentPath, this));
                }
                finally
                {
                    if (callback != null)
                    {
                        callback.OnAfterSerialization();
                    }
                }
            }
        }