У меня есть класс GameState следующим образом;Как я могу исправить бесконечный цикл сериализации игры в libGdx?
public class GameState
{
private Array<Fleet> fleets;
private Array<Planet> planets;
private Array<Player> players;
//Constructors, methods, yada yada
}
Очень упрощенный формат моего класса Fleet; общественный класс Fleet { частные корабли; частный владелец;
public Fleet(Player owner)
{
this.owner = owner;
this.ships = new Array<Ship>();
}
//Methods
}
Упрощенный Player
класс;
public class Player
{
private Array<Fleet> fleets;
public Player()
{
fleets = new Array<Fleet>();
}
}
Я использую libGdx Json.toJson(state);
, чтобы сохранить свою игру в формате JSON.
Я сохранил информацию в прямых ссылках, но это вызвало некоторые незначительные проблемы. Во-первых, каждая ссылка на данные в GameState
, когда она сериализована, считывается читателем Json как ее собственный экземпляр. Итак, если бы я сериализовал GameState x
, то десериализовал его, он прочитал бы мой Array
из Fleet
в GameState и переместился на planets
, затем переместился на players
. Всякий раз, когда он нашел одну из исходных ссылок на экземпляр, хранящийся в fleets
, он рассматривал бы его как свой собственный экземпляр.
Это означает, что перед загрузкой новой игры две ссылки указывают на одну и ту же часть памяти, но после сохранения и перезагрузки они будут указывать на отдельные фрагменты памяти. Кроме того, поскольку Fleet
хранит список Ship
в нем, и каждый Ship
содержит ссылку в форме своего родительского поля fleet
, сериализатор Json
и десериализатор будут выбрасываться в бесконечный цикл из-за этого.
Я пытался сделать this, как это казалось в простой подход, но, как Натан отметил в принятом ответе, не самый эффективный подход.
Как воссоздать эту проблему короче?
GameState класс
public class GameState
{
public Array<Player> players;
public GameState()
{
this.players = new Array<Player>();
players.add(new Player());
players.add(new Player());
}
}
класс игрока
public class Player
{
public Array<Fleet> fleets;
public Player()
{
fleets = new Array<Fleet>();
}
public void addFleet(Fleet fleet)
{
fleets.add(fleet);
}
}
Fleet класс
public class Fleet()
{
public Player owner;
public Fleet(Player owner)
{
this.owner = owner;
this.owner.fleets.add(this);
}
}
MainGame класс
public class MainGame extends Game
{
@Override
public void create()
{
GameState state = new GameState();
state.fleets.add(new Fleet(state.players.get(0)));
state.fleets.add(new Fleet(state.players.get(1)));
Json json = new Json();
String infiniteLoopOrStackOverflowErrorHappensHere = json.toJson(state);
state = json.fromJson(infiniteLoopOrStackOverflowErrorHappensHere);
}
}
Вы должны получить бесконечный цикл из этого или ошибку StackOverflow.
Спасибо за ответ. Я решил сделать что-то вроде этого, сохранив соответствующий идентификатор в классе «DeserializationData», который содержит идентификаторы таких вещей, как флоты, которыми владеет каждый игрок. Я настроил сериализацию и десериализацию с помощью Json.Serializable. –