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(enum の「EventA」です)。

しかし、JSON を EventLog インスタンスに逆シリアル化するのに問題があります (「型はインターフェイスまたは抽象クラスであり、インスタンス化できません」)。もちろん、デシリアライザーがリスト内の各イベントの必要なタイプを判別できないことは明らかです。しかし、EventType プロパティ (この場合は 0 または 1) による型の情報を持っているので、その情報を使用して全体を適切に逆シリアル化する方法を考えています。

ありがとうございました。

4

2 に答える 2

1

JsonConverterこの点であなたは助けることができますか?ただし、シリアル化を行う際には、型名を入力する必要があります。詳細については、using-json-net-converters-to-deserialize-propertiesの質問を参照してください

于 2012-12-23T08:09:17.567 に答える
1

JSON.Net ではありませんが、System.Web.Script.Serialization.JavaScriptSerializerを使用すると、SimpleTypeResolverを使用して派生型をインターフェイスにマップできます。

JSON.Netを使用すると、カスタム動作でシリアライゼーションとデシリアライゼーションのレベルを処理するためのアクセスを提供するIContractResolverでこれを達成できるようです。

これらのメソッドはどちらも、シリアル化中に JSON に何か (タイプを示す追加のプロパティなど) を挿入する必要があるようです。

于 2012-12-22T14:40:08.253 に答える