无法在本地重现NewtonSoft反序列化错误

时间:2016-03-23 14:06:18

标签: c# json json.net datacontractjsonserializer

我在反序列化json对象时遇到以下错误:(使用JSON.NET)

  

无法创建抽象类   在System.Runtime.Serialization.FormatterServices.nativeGetUninitializedObject(RuntimeType类型)
  在ReadDataSourceBaseFromJson(XmlReaderDelegator,XmlObjectSerializerReadContextComplexJson,XmlDictionaryString,XmlDictionaryString [])

给出错误的确切行是:

return _serializer.ReadObject(stream); // _serializer is DataContractJsonSerializer

我无法在本地计算机或托管环境中的舞台计算机中重现此问题。 JSON完全反序列化

然而,问题在质量保证和生产环境中可以一致地重现。我试过

  • 质量保证数据库
  • 发布模式下的QA代码,包括所有DLL
  • QA网络配置
但仍然无法生产。 JSON对象存储在数据库中,我正在尝试将其序列化为类。

我还能做些什么来重现这个问题?

修改

导致错误行的代码是:

var json = JObject.Parse(definition);
var foo = json.GetValue("outerRoot").ToString();
var dataDefinition = _serializer.Deserialize(foo);

反序列化函数是

public returnType Deserialize(string serializedData)
        {
            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(serializedData)))
            {
                return (returnType)_serializer.ReadObject(stream);
            }
        }

所以我使用JSON.Net去掉最外面的节点并反序列化里面的内容。

3 个答案:

答案 0 :(得分:1)

当我遇到只在PROD上发生的事情时,我会将应用程序设置为在本地IIS而不是IIS Express上运行。这要求您在开发计算机上安装了IIS,但是这允许您在本地进行调试并从远程计算机访问该站点以导致错误。

答案 1 :(得分:0)

在您实例化DataContractJsonSerializer的代码中,您将指定反序列化类型。 代码看起来像这样:

_serializer = new DataContractJsonSerializer(typeof(MyType));

您为反序列化指定的类型似乎具有抽象关键字。

public abstract class MyType

在C#中,你不能实例化抽象类,只能实现非抽象类,即从它们继承的类。

答案 2 :(得分:0)

这是Framework 4.0问题,已在Framework 4.5 WCF JSON Deserialization Issues with Whitespace

中修复

解决方案是升级Framework。或者dbc在评论中说了什么