Asp.net mvc 4 如何让WebAPI XML序列化程序使用TypeConverter

Asp.net mvc 4 如何让WebAPI XML序列化程序使用TypeConverter,asp.net-mvc-4,xml-serialization,asp.net-web-api,json.net,Asp.net Mvc 4,Xml Serialization,Asp.net Web Api,Json.net,在ASP.NET Web API项目中,我有一个自定义类型,它带有一个TypeConverter,用于处理字符串转换的“到”和“从”,如下所述: 自定义类型在我的模型中用作属性,这非常有效。我的模型对象的json包含我的自定义对象作为从TypeConverter创建的字符串值 因此,我将请求切换为接受XML,不再调用TypeConverter,并且我的对象被错误地序列化 如何让XML序列化程序像JSON那样利用TypeConverter。引用的文章使它听起来像是使用类型转换器,当它出现时,是一个

在ASP.NET Web API项目中,我有一个自定义类型,它带有一个TypeConverter,用于处理字符串转换的“到”和“从”,如下所述:

自定义类型在我的模型中用作属性,这非常有效。我的模型对象的json包含我的自定义对象作为从TypeConverter创建的字符串值

因此,我将请求切换为接受XML,不再调用TypeConverter,并且我的对象被错误地序列化

如何让XML序列化程序像JSON那样利用TypeConverter。引用的文章使它听起来像是使用类型转换器,当它出现时,是一个可预测的特性。如果这完全是序列化程序的一时兴起,那么以一致的方式制作用XML和JSON表示数据的API几乎是不可能的

文章中的示例代码,以及一些上下文:

[TypeConverter(typeof(LocationTypeConverter))]
public class Location
{        
    public int X { get; set; }
    public int Y { get; set; }

    // Parse a string into a Location object. "1,2" --> Loc(X=1,Y=2)
    public static Location TryParse(string input)
    {
        var parts = input.Split(',');
        if (parts.Length != 2)
        {
            return null;
        }

        int x,y;
        if (int.TryParse(parts[0], out x) && int.TryParse(parts[1], out y))
        {
            return new Location { X = x, Y = y };                
        }

        return null;
    }

    public override string ToString()
    {
        return string.Format("{0},{1}", X, Y);
    }
}

public class LocationTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, 
       System.Globalization.CultureInfo culture, object value)
    {
        if (value is string)
        {
            return Location.TryParse((string) value);
        }

        return base.ConvertFrom(context, culture, value);
    }
}
使用该类创建模型:

public class SampleModel
{
   public int One { get; set;}
   public string Two { get; set;}
   public Location Three { get; set;}
}
使用以下方法创建ApicController:

public SampleModel Get()
{
   return new SapleModel { One = 1, Two = "Two", Three = new Location { X = 111, Y = 222 } };
}

就这样。使用fiddler并尝试这两种方法,注意Location使用转换器将序列化为单线逗号分隔格式,如3th=111222,使用Json,但不使用XML

你能分享一下复制代码吗?当然,我刚刚从那篇参考文章中找到了一个应该能说明这个问题的代码。你试过使用隐式转换运算符吗?