奇怪的反序列化异常

时间:2019-08-20 19:32:37

标签: c# json.net

我有2个共享一个程序集的应用程序。 第一个序列化一个对象,然后将其发送给另一个序列化以进行进一步处理。

这是我试图反序列化数据时的另一端...

Exception Details

...使用“ AppDomain.CurrentDomain.GetAssemblies()”查看监视窗口中加载的程序集,我注意到有问题的程序集已加载到应用程序域中,但由于某些原因,Newtonsoft反序列化器无法选择它起来

有什么想法我应该在哪里寻找解决方案?

其他一些可能相关的信息...

  • 两个应用程序都在.Net Core 2.2之上运行
  • 第一个应用程序是网络api应用程序。
  • 第二个是Azure Functions应用。
  • 由于使用了azure函数SDK,我不得不使用newtonsoft lib的v11。
  • 所讨论的对象已使用Json选项“”进行了序列化

需要从评论中获取更多信息...

有关该异常的实际消息是:

Error resolving type specified in JSON 'Core.Objects.Workflow.Activities.Start`1[[System.Object, mscorlib]], Core.Objects'. Path 'Activities[0].$type', line 1, position 285.

还有进一步的内部异常报告...。

Could not load file or assembly 'Core.Objects, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.

此异常发生时,我在FlowDefinition内部,调用了如下定义的GetFlow()...

public class FlowDefinition
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    [ForeignKey("App")]
    public int AppId { get; set; }

    [Required]
    public string Name { get; set; }

    public string DefinitionJson { get; set; }

    public string ConfigJson { get; set; }

    [DontPrivilege]
    public Flow GetFlow() { return DefinitionJson != null ? JsonConvert.DeserializeObject<Flow>(DefinitionJson, ObjectExtensions.JSONSettings) : null; }

    [DontPrivilege]
    public dynamic GetConfig() { return ConfigJson != null ? JsonConvert.DeserializeObject<ExpandoObject>(ConfigJson, ObjectExtensions.JSONSettings) : null; }

    public virtual App App { get; set; }

    public virtual ICollection<FlowInstanceData> Instances { get; set; }
    public virtual ICollection<BusinessProcessWorkflow> Processes { get; set; }
}

public class Flow

{
    [Key]
    [Required]
    public string Name { get; set; }

    public string RequiredRoles { get; set; }

    public Activity[] Activities { get; set; }

    public Link[] Links { get; set; }
}

...活动是我所有活动类型的抽象基本类型,不能直接反序列化,而必须看到派生类型。

这是系统失败的示例JSON字符串...

{
   "Name":"Test",
   "RequiredRoles":"",
   "Links":[
      {
         "Source":"Start",
         "Destination":"53c102ac10ce109d7d62c489beb242ccb10a62d83",
         "Expression":"{destination}.Item = {source}.Data.Message"
      }
   ],
   "Activities":[
      {
         "$type":"Core.Objects.Workflow.Activities.Start`1[[System.Object, mscorlib]], Core.Objects",
         "Ref":"Start",
         "AuthToken":null,
         "Data":null,
         "State":null,
         "Previous":null,
         "Next":null,
         "AssignValues":null
      },
      {
         "$type":"Core.Objects.Workflow.Activities.DebugActivity, Core.Objets, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
         "Ref":"53c102ac10ce109d7d62c489beb242ccb10a62d83",
         "Item":null,
         "State":null,
         "Previous":null,
         "Next":null,
         "AssignValues":null,
         "Data":null
      }
   ]
}

...上面显示的所有类型都在同一程序集中定义,并编译为.Net Core 2.2 Azure函数应用程序正在使用的.Net Standard 2.0程序集。

1 个答案:

答案 0 :(得分:1)

请检查是否使用的对象具有构造函数/依赖关系,其中包含由于缺少依赖关系而无法反序列化的对象。

还要检查类型是否包含Core。 Objets ,而不是Core。 Objects