Asp.net mvc 4 如何让WebAPI XML序列化程序使用TypeConverter
在ASP.NET Web API项目中,我有一个自定义类型,它带有一个TypeConverter,用于处理字符串转换的“到”和“从”,如下所述: 自定义类型在我的模型中用作属性,这非常有效。我的模型对象的json包含我的自定义对象作为从TypeConverter创建的字符串值 因此,我将请求切换为接受XML,不再调用TypeConverter,并且我的对象被错误地序列化 如何让XML序列化程序像JSON那样利用TypeConverter。引用的文章使它听起来像是使用类型转换器,当它出现时,是一个可预测的特性。如果这完全是序列化程序的一时兴起,那么以一致的方式制作用XML和JSON表示数据的API几乎是不可能的 文章中的示例代码,以及一些上下文: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。引用的文章使它听起来像是使用类型转换器,当它出现时,是一个
[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 你能分享一下复制代码吗?当然,我刚刚从那篇参考文章中找到了一个应该能说明这个问题的代码。你试过使用隐式转换运算符吗?