通过JSON.Net 4.0 r3反序列化的BindingFailure

时间:2011-11-14 18:38:26

标签: clr json.net

我正在尝试反序列化由JSON.Net 4.0 r3本身序列化的JSON字符串。序列化和反序列化的设置相同。发生以下异常:

  

无法找到类型   “System.Collections.Generic.List`1 [[System.Drawing.PointF,   System.Drawing]]'在assembly'“mscorlib,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089“'

打开“抛出BindingFailure时停止”,我看到问题出在以下部分(JSON.Net源代码,DefaultSerializationBinder.cs):

  if (assemblyName != null)
  {
    Assembly assembly;

#if !SILVERLIGHT && !PocketPC
    // look, I don't like using obsolete methods as much as you do but this is the only way
    // Assembly.Load won't check the GAC for a partial name
#pragma warning disable 618,612
    assembly = Assembly.LoadWithPartialName(assemblyName);
#pragma warning restore 618,612
#else
    assembly = Assembly.Load(assemblyName);
 #endif

    if (assembly == null)
      throw new JsonSerializationException("Could not load assembly '{0}'.".FormatWith(CultureInfo.InvariantCulture, assemblyName));

    Type type = assembly.GetType(typeName); // BindingFailure here
    if (type == null)
      throw new JsonSerializationException("Could not find type '{0}' in assembly '{1}'.".FormatWith(CultureInfo.InvariantCulture, typeName, assembly.FullName));
  }

BindingFailure点显示的错误是

  

显示名称为“System.Drawing”的程序集无法加载   'LoadFrom'绑定AppDomain的上下文,ID为1.原因   失败的原因是:System.IO.FileNotFoundException:无法加载文件   或程序集'System.Drawing'或其依赖项之一。系统   找不到指定的文件。

操作系统是Windows 7,64位。我正在使用Visual Studio 2010并将此应用程序作为Framework v4的目标。目标不是Silverlight或PocketPC。

为什么在这种情况下无法加载“System.Drawing”?我应该从哪里开始调查这是JSON.Net问题还是我的Framework 4.0安装问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

事实证明这个问题与JSON.Net有关。我曾经使用以下设置

jsonSerializerSettings = new JsonSerializerSettings
{
     TypeNameHandling = TypeNameHandling.All
};

这是因为帖子中的建议(涉及反序列化像List这样的通用集合)。有人建议,完整类型信息将有助于解决有关“无法实例化抽象基类”的错误消息的JSon.Net错误。

如果我将其更改为

jsonSerializerSettings = new JsonSerializerSettings
{
     TypeNameHandling = TypeNameHandling.Auto
};

它工作正常。有趣的是,一些类型信息不会被释放,我没有得到BindingFailure,反序列化工作正常。我不知道为什么它首先不适用于“Auto”。