Ошибка 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) - ошибка сохраняется