В нашем проекте мы отвечаем за создание настольной версии настольной игры. Моя роль заключается в реализации методов сохранения и загрузки. По этой причине я работаю над сериализацией. Я пытаюсь сериализовать объекты, которые содержат другие объекты. Для наглядности я подготовил несколько примеров классов.
import java.io.Serializable;
public class Player implements Serializable
{
static int id;
static String name;
public Player(String name)
{
this.name = name;
}
}
import java.io.Serializable;
public class Team implements Serializable
{
String name;
transient Player c;
int[] numbers;
public Team(String name, String capt){
this.name = name;
this.c = new Player(capt);
}
public Player getC()
{
return c;
}
public String getName()
{
return name;
}
}
public class test implements Serializable
{
public static void main(String args[])throws IOException
{
Team t1 = new Team("Juventus", "Ronaldo");
Team t2 = new Team("Barcelona", "Messi");
File file = createSave("1");
save(file,t1,t2);
Team[] teams = load(file);
System.out.println("Team 1 is: " + teams[0].getName());
System.out.println("Team 2 is: " + teams[1].getName());
System.out.println("Captain of team 1 is: " + teams[0].getC().name);
System.out.println("Captain of team 2 is: " + teams[1].getC().name);
}
private static File createSave(String gameId) throws IOException
{
File file = new File(gameId + ".txt");
if (file.createNewFile())
{
System.out.println("File is created!");
}
else
{
System.out.println("File already exists.");
}
return file;
}
private static void save(File file, Team t1, Team t2)throws IOException
{
FileOutputStream f = new FileOutputStream(file);
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(t1);
o.writeObject(t2);
o.close();
f.close();
}
private static Team[] load(File file)throws IOException
{
try {
Team[] teams = new Team[2];
FileInputStream fi = new FileInputStream(file);
ObjectInputStream oi = new ObjectInputStream(fi);
Team team1 = (Team) oi.readObject();
Team team2 = (Team) oi.readObject();
teams[0] = team1;
teams[1] = team2;
oi.close();
fi.close();
return teams;
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Подводя итог части кода: я создаю класс игрока и командный класс, который содержит объекты игрока. В командном классе есть метод, который возвращает капитана команды. Я создаю два экземпляра команды, первый - Ювентус, а капитан - Роналду. Второй - Барселона, а капитан - Месси. Затем я сохранил эти два командных объекта в текстовый файл с помощью ObjectOutputStream. А в методе загрузки я загрузил две команды с помощью ObjectInputStream и вернул их в виде массива.
Когда я попытался получить переменные имен двух групповых объектов, я смог. Однако я не смог добраться до капитанов команд. Доступен только последний созданный объект игрока. Позвольте мне поделиться своим выводом:
Файл уже существует.
Команда 1: Ювентус
Команда 2: Барселона
Капитан команды 1: Месси
Капитан команды 2: Месси
Как видно из результатов, я могу достичь только последний созданный внутренний объект. Игрок Роналду сейчас потерян. Я был бы очень рад, если бы вы могли мне помочь.