3

我有一个包含不同类型事件的列表的“包装器”类。因此,列表本身使用通用的“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),我拥有类型的信息,我想知道如何使用该信息正确反序列化整个事物。

谢谢你。

4

2 回答 2

1

好吧,它不是 JSON.Net,而是使用System.Web.Script.Serialization.JavaScriptSerializer,您可以使用SimpleTypeResolver将派生类型映射到接口。

使用 JSON.Net,这似乎可以通过IContractResolver来实现,它使您可以使用自定义行为来处理序列化和反序列化级别。

似乎这两种方法都需要在序列化期间将某些东西(例如指示类型的额外属性)插入 JSON。

于 2012-12-22T14:40:08.253 回答
1

JsonConverter你能在这方面提供帮助吗?但是您需要在进行序列化时输入类型名称。有关更多信息,请参阅问题using-json-net-converters-to-deserialize-properties

于 2012-12-23T08:09:17.567 回答