Как я могу сериализовать объект, содержащий объекты в java? - PullRequest
0 голосов
/ 28 апреля 2020

В нашем проекте мы отвечаем за создание настольной версии настольной игры. Моя роль заключается в реализации методов сохранения и загрузки. По этой причине я работаю над сериализацией. Я пытаюсь сериализовать объекты, которые содержат другие объекты. Для наглядности я подготовил несколько примеров классов.

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: Месси

Как видно из результатов, я могу достичь только последний созданный внутренний объект. Игрок Роналду сейчас потерян. Я был бы очень рад, если бы вы могли мне помочь.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Ну, прежде всего, вам нужна практика и больше узнать об основах java. Ошибка, которую вы сделали, в классе Player. Вы устанавливаете имя как поле stati c. У всех вас могут быть только 1 имя.

Попробуйте заменить свой класс следующим образом:

import java.io.Serializable;

public class Player implements Serializable {
    private int id;
    private String name;

    public Player(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Следующим в классе команды просто удалите переходный процесс

Player c;

И в основной класс использует

System.out.println("Captain of team 1 is: " + teams[0].getC().getName());
System.out.println("Captain of team 2 is: " + teams[1].getC().getName());

Теперь ваш код должен работать :) Это не идеально, но это должно решить вашу проблему

0 голосов
/ 28 апреля 2020

Я бы всегда рекомендовал GSON для сериализации и десериализации объектов. Взгляни на это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...