/// <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(); } } } }
/// <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(); } } } }