jQuery火箭图标返回顶部代码

Newtonsoft.Json

1、技术概述,描述这个技术是做什么?学习该技术的原因,技术的难点在哪里

  • 技术概述:Json.NET是一个开源的Json操作类库,Newtonsoft.Json是.Net中开源的Json序列化和反序列化工具
  • 学习该技术的原因:在前后台数据交互或者APP与后台交互的时候,通常使用Json进行数据交互,涉及到几个序列化对象的使用:DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET即 Newtonsoft.Json,一般选择性能以及通用性较好Json.NET,速度比 DataContractJsonSerializer 快 50%,比 JavaScriptSerializer 快 250%,以下为性能对比图:

2、技术详述,描述你是如何实现和使用该技术的,要求配合代码和流程图详细描述。可以再细分多个点,分开描述各个部分

3、技术使用中遇到的问题和解决过程。要求问题的描述和解决有一定的内容,不能草草概括。要让遇到相关问题的人看了你的博客之后能够解决该问题

  • Newtonsoft.Json版本不一致问题解决
  • 问题描述:A程序集引用了 Newtonsoft.Json 6.0程序集,B程序集引用了 Newtonsoft.Json 10.0程序集,此时A引用B,就会报:发现同一依赖程序集的不同版本间存在无法解决的冲突 这一警告,执行程序就会报错–System.IO.FileNotFoundException: 未能加载文件或程序集Newtonsoft.Json xx.x的错误
  • 问题分析:这是因为依赖顺序引起的。A引用了B,首先会先生成B,而B引用了 Newtonsoft.Json 10.0,那么VS就会将源引用文件(Newtonsoft.Json 10.0)复制到B程序集同一目录(bin/Debug)下,名为Newtonsoft.Json.dll文件,其内嵌程序集版本为10.0。然后A引用了B,所以会将B程序集和B程序集的依赖项10.0(Newtonsoft.Json.dll)给复制到A的程序集目录下,而A又引用了Newtonsoft.Json 6.0程序集文件,所以又将6.0的dll文件给复制到自己程序集目录下。因为两个Newtonsoft.Json.dll重名,所以直接覆盖了前者,那么只保留了Newtonsoft.Json 6.0。当我们调用Func方法中的B.FuncB()时候,CLR会搜索B程序集,找到后再调用 return Newtonsoft.Json.Obj 这行代码,而这行代码又用到了Newtonsoft.Json程序集,接下来CLR搜索Newtonsoft.Json.dll,文件名称满足,接下来CLR判断其标识,发现版本号是6.0,与B程序集清单里注册的10.0版本不符,故而才会报出异常:未能加载文件或程序集Newtonsoft.Json 10.0。
  • 解决方案:
    • 1、通过bindingRedirect节点重定向,即当找到10.0的版本时,给定向到6.0版本
      <runtime>
           <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <dependentAssembly>
                     <assemblyIdentity name="Newtonsoft.Json"
                                       publicKeyToken="30ad4fe6b2a6aeed"
                                       culture="neutral" />
                     <bindingRedirect oldVersion="10.0.0.0"
                                      newVersion="6.0.0.0" />
                </dependentAssembly>
           </assemblyBinding>
      </runtime>
    
    • 2、对每个版本指定codeBase路径,然后分别放上不同版本的程序集,这样就可以加载两个相同的程序集
      <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
              <assemblyIdentity name="Newtonsoft.Json"
                                publicKeyToken="30ad4fe6b2a6aeed"
                                culture="neutral" />
              <codeBase version="6.0.0.0"
                        href="E:6.0Newtonsoft.Json.dll" />
          </dependentAssembly>
          <dependentAssembly>
              <assemblyIdentity name="Newtonsoft.Json"
                                publicKeyToken="30ad4fe6b2a6aeed"
                                culture="neutral" />
              <codeBase version="10.0.0.0"
                        href="E:10.0Newtonsoft.Json.dll" />
          </dependentAssembly>
          </assemblyBinding>
      </runtime>
    

4、进行总结
  Newtonsoft.Json 涉及的内容不少,由于多因素限制,对于该知识的学习是浅尝辄止,仅接触了皮毛( 官网 )。知识的学习需要坚持,要有专研的精神。当自己不深入学习的时候,对一些事情的判断就可能有失偏颇,如果想让自己把技术运用的得心应手,就要深入进去,了解其里,才能有所得。不然就只能做到知其然不知其所以然,仅仅懂得去套代码而不能理解。

5、列出参考文献、参考博客(标题、作者、链接)

原文地址:https://www.cnblogs.com/dongbo-221701313/p/13188940.html