我在 ApiController 中有以下简单的代码:
public Version Get()
{
var version = new System.Version(1, 1, 0, 0);
return version;
}
这导致以下结果:
杰森
{"_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 序列化具有 [可序列化] 属性(例如版本)的类型字段。我不是它的忠实粉丝,这就是为什么 Json.NET 默认不这样做的原因,但这就是 Web API 人员想要的。
这将停止 Web API 在 JSON 中执行此操作:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new DefaultContractResolver();
在不更改整个序列化程序的情况下,可以返回与 CLR Version 类映射的自定义对象。
版本号不应经常更改。我建议对它发表评论,这样你未来的自己就不会重构它。
如果您使用的是 DataContractSerializer,请尝试以下操作:
config.Formatters.XmlFormatter.SetSerializer(myType, new DataContractSerializer(myType, new DataContractSerializerSettings() { SerializeReadOnlyTypes = true });
否则,请确保 JSON.NET 是最新的。序列化只读属性应该没有任何困难。
我已经用 JSON.NET 进行了测试,它似乎选择了像您的输出一样命名的字段并完全避免了公共属性。
作为临时解决方案,我将复制该对象并将其返回,以便更好地控制序列化。
最新的 JSON.NET 和MVC二进制文件给出了相同的结果。如果设置控制台应用并使用 JSON.NET 进行序列化,则会获得预期的(无下划线)版本。您可以尝试使用媒体类型格式化程序和序列化程序坐立不安,但说实话,我只是创建一个值对象来包装 Version 并完成它。
我还尝试创建一个具有只读属性的值对象,以及没有 setter 的字段支持属性。这一切都是在没有下划线的情况下序列化的。必须是 Version 类本身中的某些内容。
如果你想要一个快速的解决方法,这里有一个
public object Get()
{
var version = new System.Version(1, 2, 3, 4);
return new
{
version.Build,
version.Major,
version.Minor,
version.Revision
};
}
抱歉,我无法帮助您解决此问题。在不同的案例中,我也有类似的东西。我只能命令你
使用- String.Replace('_',string.空());
- 反序列化它。
我希望它会有所帮助。