C# 使用JSON.NET反序列化类型为接口的列表

C# 使用JSON.NET反序列化类型为接口的列表,c#,.net,serialization,json.net,deserialization,C#,.net,Serialization,Json.net,Deserialization,我有一个包含不同类型事件的列表的“包装器”类。因此,列表本身使用一个通用的“AnEvent”接口,而不是具体的类型 public class EventLog { [JsonProperty()] private List<AnEvent> events; // note that the list is private and has no getter/setter } 最后但并非最不重要的一点是,具体的事件类型可以如下所示: //public enu

我有一个包含不同类型事件的列表的“包装器”类。因此,列表本身使用一个通用的“AnEvent”接口,而不是具体的类型

public class EventLog
{
    [JsonProperty()]
    private List<AnEvent> events;

    // note that the list is private and has no getter/setter
}
最后但并非最不重要的一点是,具体的事件类型可以如下所示:

//public enum EventTypes { EventA, EventB };

public interface AnEvent
{
    EventTypes EventType
    {
        get;
        set;
    }

    // some other properties...
}
public class ConcreteEventA : AnEvent
{
    private EventTypes eventType = EventTypes.EventA;

    public EventTypes EventType
    {
        get { return eventType; }
        set { eventType = value; }
    }

     // ...
}


public class ConcreteEventB : Event
{
    // ....
}
正如您所看到的,关于事件类型的信息在这里有点多余(有类本身的类型,例如ConcreteEventA,并且类中有一个名为EventType(enum)的属性)

EventLog对象的序列化工作正常,并返回事件的JSON列表。事件的类型表示如下:
“EventType”:0
(它是枚举的“EventA”)

但我很难将JSON反序列化回EventLog实例(“类型是接口或抽象类,无法实例化”)。当然,很明显,反序列化程序无法确定列表中每个事件所需的类型。但是,由于EventType属性(在本例中是0或1)导致我拥有该类型的信息,因此我想知道如何使用该信息来正确地反序列化整个事件


谢谢。

好吧,它不是JSON.Net,但有了它,您可以使用将派生类型映射到接口

在JSON.Net中,这似乎可以通过一个允许您使用自定义行为处理序列化和反序列化级别的应用程序来实现


在序列化过程中,这两种方法似乎都需要在JSON中插入一些东西(比如一个表示类型的额外属性)。

JsonConverter
在这方面您能提供帮助吗。但是在进行序列化时,需要输入类型名称。有关更多信息,请参见问题

有时存在一些属性,这些属性为反序列化程序提供有关实际类类型的信息。然后可以反序列化接口。由于我不知道你的反序列化程序,我不能告诉你这些是哪一个我仍然不明白你的接口的目的是什么。在这种情况下,对于一种类型的事件使用两个构造函数不是更明智吗?