我正在将针对完整框架的 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/