【问题标题】:Deserializing interface objects in JSON.NET在 JSON.NET 中反序列化接口对象
【发布时间】:2014-04-10 13:28:12
【问题描述】:

我正在尝试从 Web API 调用返回 JSON 对象。我想根据它实现的接口返回这个对象,所以:

response.Content.ReadAsAsync<IThingy>().Result

我收到此错误:

无法创建 IThingy 类型的实例。类型是接口或抽象类,不能实例化。

真的,这和this question 中的问题一样,只是我想反序列化实现接口的对象,而不是反序列化类型实现接口的属性。

如何进行这种反序列化?

【问题讨论】:

    标签: c# json serialization asp.net-web-api


    【解决方案1】:

    您需要反序列化为具体的类,因为该类的行为必须定义。你需要一个Thingy : IThingy 我会这样做:

    IThingy result = response.Content.ReadAsAsync<Thingy>().Result;
    

    为什么必须这样做?接口没有定义行为,只有签名的方法和属性。假设您能够直接反序列化为 IThingy 并且它有一个方法 DoMath(int x, int y) - 会进行什么数学运算?不会有明确的行为。这就是为什么你必须选择一个具体的类。

    【讨论】:

    • 是的,我传递的接口确实是签名——因为我传递的是数据传输对象(没有方法)。传递接口减少了它们实际实现的耦合。
    • 当然我有具体的类,但我想根据接口传递它们的实例。
    • @Gigi 这是一个常见的误解。接口是具体类型的签名。解耦是关于接口与具体类型的 SOLID AKA 耦合。但是,在某些时候,SOMETHING 必须知道要使用什么类型。在控制反转的场景中,最顶层的类/启动将知道并解决依赖关系。这种反序列化是您的应用程序的另一个入口点,它还必须了解您的具体类型。这很正常。除非您反序列化为 dynamic 类型,否则您无法避免反序列化为具体类型,我当然不建议这样做。
    • 如果您非常担心,只需创建一个类似IThingyDeserializer 的接口并有一个具体的Deserializer&lt;T&gt; where T : Thingy 将反序列化为具体类型Thingy...然后使用它直接将混凝土拒之门外。但是请注意,这将是相当大的矫枉过正。
    • 谢谢。只有一个问题......那么为什么可以反序列化接口属性(根据相关链接)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多