gpt4 book ai didi

c# - 使用 JSON.NET 反序列化类型为接口(interface)的列表

转载 作者:行者123 更新时间:2023-11-30 17:08:10 28 4
gpt4 key购买 nike

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

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 实例(“类型是接口(interface)或抽象类,无法实例化”)。当然,绝对清楚的是,反序列化器无法确定列表中每个事件所需的类型。但是由于我有 EventType 属性(在本例中为 0 或 1)引起的类型信息,我想知道如何使用该信息正确地反序列化整个事物。

谢谢。

最佳答案

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

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

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

关于c# - 使用 JSON.NET 反序列化类型为接口(interface)的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002716/

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