【问题标题】:Deserialization abstract class implementation .Net Core C#反序列化抽象类实现.Net Core C#
【发布时间】:2020-02-14 05:17:49
【问题描述】:

简短说明: Angular 和 .NetCore 中的项目,我尝试在后端更新抽象类列表。 通过创建一个 put 请求,我更新了包含我要更新的列表的容器模型。 前端用JSON.stringify();序列化容器模型

当我的 put 请求到达我的端点时,它会立即开始反序列化。我得到了例外: System.NotSupportedException:不支持没有无参数构造函数的引用类型的反序列化。键入“平铺”。

这个异常并不让我吃惊,因为抽象类不能被实例化。所以我尝试使用自定义的 JsonConverter 来定义何时转换为哪个类。但是这个转换器永远不会被调用。我在 ReadJson 方法中放置了一个断点,但在到达断点之前抛出了异常。

Custom JsonConverter

Abstract model

Implementation of the abstract class

Put Endpoint

更新:

所以在继续几个小时后,我发现我的项目使用 System.Text.Json.Serialization 来序列化对象。我创建的 CostumConverter 是 Newtonsoft。这就是为什么它可能不被调用的原因。 有没有办法指定我的项目使用哪个? 我有一个 startup.cs 文件,我认为这样的东西可能会放在那里。

【问题讨论】:

  • 是被调用的转换器方法上的CanConvert 吗?
  • 感谢您的快速回答。它没有被调用。
  • 那么有两种选择:一,无论你的实际财产在哪里,都应用转换器;二,将转换器添加到您的反序列化配置中。 (默认一个或每个反序列化单独)

标签: c# json serialization .net-core abstract-class


【解决方案1】:

您可以使用泛型类型参数,允许您在编译时为方法指定任意类型 T,而无需在方法或类声明中指定具体类型。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-type-parameters

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多