gpt4 book ai didi

c# - JSON.NET:反序列化包含从接口(interface)派生的对象列表的类

转载 作者:行者123 更新时间:2023-11-30 12:11:25 25 4
gpt4 key购买 nike

我在反序列化我的对象时遇到了麻烦。它包含以下属性:

public List<IShape> Shapes { get; set; };

JSON.NET 反序列化器总是告诉我,无法实例化接口(interface)。

我有几个实现接口(interface)的类,这些接口(interface)实现了 IShape 接口(interface),例如Polyline -> IPolyline -> IShape .我已经尝试了两种解决方案:

但我遇到了同样的异常,IShape 无法被实例化,被抛出。

我用 TypeNameHandling.Auto 序列化对象, TypeNameHandling.All也没有帮助,即使我使用上面链接的帖子中提到的转换器也是如此。

有谁知道这个问题的解决方案吗?如果需要一些代码,我会很乐意发布。

这是生成的 JSON 示例。

"$type": "SketchModel.Layer, SketchModel",
"Id": 57865477,
"Shapes": {
"$type": "System.Collections.Generic.List`1[[SketchModel.Shapes.AbstractShapes.IShape, SketchModel]], mscorlib",
"$values": [
{
"$type": "SketchModel.Shapes.Polyline, SketchModel",

这一行是造成问题的原因:

"System.Collections.Generic.List`1[[SketchModel.Shapes.AbstractShapes.IShape, SketchModel]], mscorlib"

它根本不知道如何实例化 IShape。如果我创建一个自定义转换器并让它为每个 IShape 返回一条折线,它可以工作,但不会创建任何其他形状(例如椭圆)。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)在自定义转换器中重写的方法,如果我让我打印 objectType 的完整类型名称,它总是 IShape,而不是其他任何东西......

最佳答案

异常是有道理的,因为反序列化器不知道在水合时接口(interface)应该表示什么具体类型。

在序列化期间,JSON.NET 允许您配置它以添加一些要在这种情况下使用的元数据。 This SO question有解释如何配置它的答案。

配置将向反序列化期间将使用的 JSON 添加一个类型属性。

关于c# - JSON.NET:反序列化包含从接口(interface)派生的对象列表的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15408588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com