我在ApiController下面简单的代码:
public Version Get()
{
var version = new System.Version(1, 1, 0, 0);
return version;
}
这导致以下:
JSON
{"_Major":1,"_Minor":1,"_Build":0,"_Revision":0}
XML
<Version xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System">
<_Build>0</_Build>
<_Major>1</_Major>
<_Minor>1</_Minor>
<_Revision>0</_Revision>
</Version>
请注意,属性的前面有一个_
。 综观的类定义Version
所有这些属性Getters
而已,我怀疑有事情做与为什么序列化添加_
。 我也试图找到信息在这里为什么发生这种情况,但所有它说, Read-only properties are serialized by default.
问题是,下划线是搞乱客户端上的反序列化,并导致版本0.0.0.0
。
这是一个CLR类,我不能重写,所以我怎么能删除下划线所以它正确地反序列化在客户端上?
默认情况下的Web API序列化的有一个[Serializable]属性(例如版)类型的字段。 我不是它的一个巨大的风扇这就是为什么Json.NET默认不这样做,但是这是在Web API人想要的东西。
这将停止网络API的JSON这样做:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new DefaultContractResolver();
在不改变整个串行器,你可以返回一个映射与CLR版本类的自定义对象。
版本号不应该过于频繁改变。 我建议把它的注释,使您的未来的自己不重构它走。
如果您正在使用的DataContractSerializer,试试这个:
config.Formatters.XmlFormatter.SetSerializer(myType, new DataContractSerializer(myType, new DataContractSerializerSettings() { SerializeReadOnlyTypes = true });
否则,请确保JSON.NET是最新的。 它不应该有序列化的只读属性的任何困难。
我曾与JSON.NET测试,它似乎皮卡是被命名为喜欢你的输出,并完全避免了公共属性的字段。
作为一个临时的解决方案,我会复制对象,所以返回它更好地控制序列化。
最新JSON.NET和MVC二进制文件赋予了相同的结果。 如果你设置了一个控制台应用程序,并使用JSON.NET序列化,你得到预期的(无下划线)版本。 您可以尝试使用的媒体类型格式化和串行坐立不安有关,但说实话,我只是创建一个值对象来包装版本,并用它做。
我也试图与只读属性创建值对象,并现场没有制定者的支持性能。 这一切都没有连载下划线。 一定有什么东西在版本类本身。
对不起,我不能帮你这个问题。 我曾在不同的情况下,类似的东西。 我可以推荐你是使用
- 与string.replace( '_',的String.Empty());
- 反序列化。
我希望这将有助于。
如果你想快速的解决方法,这里是一个
public object Get()
{
var version = new System.Version(1, 2, 3, 4);
return new
{
version.Build,
version.Major,
version.Minor,
version.Revision
};
}