Newtonsoft Json DynamicValueProvider 和 ReflectionValueProvider 的区别?

Ron*_*n C 5 json.net asp.net-core-3.0

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

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

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

#if HAVE_REFLECTION_EMIT

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

所以我在Newtonsoft.Json.Serialization命名空间中做了一些探索,我看到有一个ReflectionValueProvider可用的类不包含这种条件编译,并且在定位时可用netcoreapp3.1

我已经查看了DynamicValueProvider类和 ReflectionValueProvider类的源代码,但我不清楚其中的区别。两者似乎都是根据MemberInfo传入的构造函数来获取或设置属性或成员类型的值。两者似乎都使用反射来完成他们的工作。正如我所提到的,显然DynamicValueProvider需要反射 Emit 能力而ReflectionValueProvider不是。据我所知,发射能力显然是用来发射 IL 的。

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

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

zab*_*lus 2

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

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