json.net - Newtonsoft Json DynamicValueProvider 和 ReflectionValueProvider 的区别?

标签 json.net asp.net-core-3.0

我正在将针对完整框架的 Asp.Net Core 网站移植到针对 Asp.Net Core 3 的网站。

在这个过程中,我遇到了障碍。该网站引用了 Newtonsoft 11.0.3 NuGet 包,其中还使用了 Newtonsoft.Json.Serialization.DynamicValueProvider类(class)。

有趣的是,该类在针对完整框架时存在,但在针对 netcoreapp3.1 时不存在。因此 Visual Studio 产生编译错误,指出该类不存在。起初这对我来说似乎很疯狂,但我检查了 source code对于该类,果然它包含以下环绕整个类的条件编译语句

#if HAVE_REFLECTION_EMIT



显然,我的 netcoreapp3.1 的 NuGet 包中的 netStandard 2.0 dll项目将使用导致条件编译语句不包括 DynamicValueProvider类(class)。

所以我在 Newtonsoft.Json.Serialization 中做了一些探索命名空间,我看到有一个 ReflectionValueProvider不包含此类条件编译且在定位时可用的类可用 netcoreapp3.1
我查看了 DynamicValueProvider 的源代码类和 ReflectionValueProvider类(class),我不清楚区别。两者似乎都基于 MemberInfo 获取或设置属性或成员类型的值。传入构造函数。两者似乎都使用反射来完成他们的工作。正如我所提到的,显然 DynamicValueProvider需要反射 Emit 能力和 ReflectionValueProvider才不是。据我所知,发射能力显然是用来发射 IL 的。

所以我想知道这两者是否可以相互替代,除了 DynamicValueProvider 可能更快,因为它显然利用了 IL Emitting。但这只是一种预感。在我开始在现有代码库中将一个类替换为另一个类之前,我更希望对这两个类之间的差异有更具体的了解,以此作为进入 .Net Core 3 的一种方式。

您能否让我更深入地了解 DynamicValueProvider 之间的差异?
类和 ReflectionValueProvider类,或者至少确认我的预感?

最佳答案

我们已将 Newtonsoft.Json 从 9.* 更新到 12.0.3 版本,并观察到包含 json 序列化的路径的性能下降。所有路径都指向 DynamicValueProvider。幸运的是,我们有 DefaultContractResolver 的全局后代,并且我能够重载 CreateMemberValueProvider 方法以返回 ReflectionValueProvider。

目前我们正在继续测试新版本,但我可以说从性能角度来看,ReflectionValueProvider 比 DynamicValueProvider 工作得更快。

关于json.net - Newtonsoft Json DynamicValueProvider 和 ReflectionValueProvider 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59326926/

相关文章:

asp.net-mvc-3 - 如何在 ASP.NET MVC 3+ 应用程序中使用 Json.NET 作为默认反序列化器?

c# - 为什么 AddAfterSelf 在与 SelectToken 一起使用时返回 'JProperty cannot have multiple values'?

c# - 切换到 .net core 3 端点路由后,Identity UI 不再有效

c# - .Net Core 3.0 JsonSerializer 填充现有对象

c# - 使用 JObject 即时创建 JSON

c# - 使用包含奇怪变量的数据使用 JSON.NET 反序列化 JSON

c# - 使用 C# 和 Json.NET 根据条件序列化 JSON 对象

asp.net-core - 西装外套。单击多次时,NavLink 在 foreach block 中不起作用

c# - ASP.NET Core 3.0 身份服务器 4 (4.0.0) SecurityTokenInvalidAudienceException : IDX10214: Audience validation failed. 受众: 'empty'

asp.net-core - 将身份服务器身份验证添加到 .NET Core 3 应用程序失败并显示 'Key type not specified.'