gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:50:23 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com