Ошибка XmlSerialization - System.InvalidOperationException: 'There was an error reflecting type 'MyApp.Models.GameRequest'.'

Есть класс, хранящий поле под класс XmlSerializer

public sealed class GameConnector
{
    private static readonly XmlSerializer xmlS = new XmlSerializer(typeof(GameRequest));
    //тут ошибка при компиляции, жалуется на класс GameRequest
}

Далее идёт сам класс GameRequest и вложенный интерфейс IGameRequestData

[Serializable]
[XmlInclude(typeof(PlayerInfo))]
[XmlInclude(typeof(GameInfo))]
[XmlInclude(typeof(Card))]
[XmlInclude(typeof(BetPlayerAction))]
[XmlInclude(typeof(CallPlayerAction))]
[XmlInclude(typeof(FallPlayerAction))]
public class GameRequest
{
    public IGameRequestData Data;
    public GameRequest(IGameRequestData data)
    {
        Data = data;
    }
    public GameRequest()
    {
    }
}

IGameRequestData - интерфейс, который реализуют 2 класса - GameInfo и PlayerInfo

public interface IGameRequestData
{

}
[Serializable]
public class PlayerInfo : IGameRequestData
{
    public string PlayerName;
    public int Money;
    public PlayerAction PlayerMove;
    public PlayerInfo(string name, int money)
    {
        PlayerName = name;
        Money = money;
        PlayerMove = null;
    }
    public PlayerInfo()
    {
    }
}
[Serializable]
public class GameInfo : IGameRequestData
{
    public List<PlayerInfo> Players { get; set; }
    public List<Card> CardsOnTable { get; set; }
    public int JackpotOnTable { get; set; }
    public GameInfo()
    {

    }
}

в классе PlayerInfo также есть интерфейс PlayerAction, его реализуют 3 класса - BetPlayerAction, CallPlayerAction и FallPlayerAction

public interface PlayerAction: IGameRequestData
{

}
[Serializable]
public class BetPlayerAction : PlayerAction
{
    public int Bet;
    public BetPlayerAction(int bet)
    {
        Bet = bet;
    }
    public BetPlayerAction()
    {
    }
    public override string ToString()
    {
        return $"Bet: {Bet}";
    }
}
[Serializable]
public class CallPlayerAction : PlayerAction
{
    public int Call;
    public CallPlayerAction(int call)
    {
        Call = call;
    }
    public CallPlayerAction()
    {
    }
    public override string ToString()
    {
        return $"Bet: {Call}";
    }
}
[Serializable]
public class FallPlayerAction : PlayerAction
{
    public FallPlayerAction()
    {
    }
    public override string ToString()
    {
        return $"Fall";
    }
}

Итог: по сути всё в порядке - публичные конструкторы есть, метка [Serializable] есть. Если я убираю поле под IGameRequestData в GameRequest - то всё ок и ошибка уходит, что говорит о том, что ошибка в интерфейсе IGameRequestData, но так или иначе - в чём мой косяк и как мне сериализовывать интерфейс вообще, если я указал в XmlInclude все возможные реализации этого интерфейса (GameInfo и PlayerInfo), а также те классы, которые могут находиться в этих классах от данного интерфейса.

Примечание: я также пробовал указывать эти XmlInclude в extratypes: private static readonly XmlSerializer xmlS = new XmlSerializer(typeof(GameRequest), new type[] {typeof(все перечисленные классы) ...}); Ещё, что важно: если я уберу поле IGameRequestData в GameRequest, но оставлю в XmlInclude хотя бы на один реализующий класс от IGameRequestData (например - GameInfo или PlayerInfo) - ошибка сохраняется


Ответы (0 шт):