以下程序在 .NET 5(或 .NET Core)和 .NET Framework 上运行时会产生不同的结果。
为什么行为会不同呢?我不是要解决反序列化问题的解决方案;我的目标是理解发生了什么。
使用以下错误信息:
此外,在 .NET 4.6.2 上,若没有默认值,则行为又发生了变化。
据我所知,在这些 .NET 版本之间,
为什么行为会不同呢?我不是要解决反序列化问题的解决方案;我的目标是理解发生了什么。
class Versioned
{
public Version V {get; set;} = new Version(1,0);
}
static void Main(string[] args)
{
// Serialised with version Newtonsoft.Json 9.0.1
var json = "{\"V\":{\"Major\":2,\"Minor\":0,\"Build\":-1,\"Revision\":-1,\"MajorRevision\":-1,\"MinorRevision\":-1}}";
Console.WriteLine($".NET: {System.Environment.Version}");
Console.WriteLine($"Json.NET: {System.Reflection.Assembly.GetAssembly(typeof(Newtonsoft.Json.JsonConvert))}");
Console.WriteLine(json);
try
{
var b = Newtonsoft.Json.JsonConvert.DeserializeObject<Versioned>(json);
Console.WriteLine(b.V);
}
catch (Exception ex) { Console.WriteLine(ex.GetBaseException().Message); }
}
在.NET 5中:输出结果(为了易读性格式化):
.NET: 5.0.1
Json.NET: Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
{
"V": {
"Major": 2,
"Minor": 0,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
}
}
使用以下错误信息:
无法将当前的JSON对象(例如 {"name":"value"})反序列化为类型'System.Version',因为该类型需要一个JSON字符串值以正确反序列化。
在.NET Framework 4.6.2上输出如下:要解决此错误,请将JSON更改为JSON字符串值,或更改反序列化类型,使其成为普通.NET类型(例如不是像整数这样的基本类型,不是像数组或列表这样的集合类型),可以从JSON对象反序列化。也可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。 路径'V.Major',行1,位置14。
.NET: 4.0.30319.42000
Json.NET: Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
{
"V": {
"Major": 2,
"Minor": 0,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
}
}
1.0
此外,在 .NET 4.6.2 上,若没有默认值,则行为又发生了变化。
class Versioned
{
public Version V { get; set; }// = new Version(1, 0);
}
在 .NET 5.0 上,输出结果相同:
(...)
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Version' because...
在 .NET Framework 4.6.2 上,现在的输出结果如下:
(...)
Version's parameters must be greater than or equal to zero.
Parameter name: build
据我所知,在这些 .NET 版本之间,
System.Version
类在外部方面没有发生改变,这不应该影响这里的问题(我只知道 ISpanFormattable
的差异)。我查看了源码(.NET Core 版本 和 .NET Framework 4.8 版本),但我没有看到任何可以解释不同行为的东西。
Newtonsoft.Json
从11版本升级到最新版本会发生什么? - Pavel Anikhouskireadonly
字段的Version
的自定义版本也可以工作:https://dotnetfiddle.net/tPP3rv。我删除了`ToString`的内容,但这*不应该*影响任何东西..... - canton7