2016-01-03 12 views
0

Мне нужно сохранить и загрузить шахматную игру. В шахматах у меня есть:Как решить InvalidClassException при чтении массива Object в ObjectInputStream?

public class Chess 
{ 
private Piece[][] pieceArray; 
private Board board; 
private int moves; 
private boolean turn; 
... 
Set's and get's 
} 

Мне нужно было бы загрузить поворот, двигаться и матрицу. На данный момент Im только сохраняет и загружает матрицу (Pieces [] [])

Теперь у меня есть эти методы для сохранения и загрузки игры в другом классе В этом классе у меня есть FTPClient, подключенный к серверу.

Сохранение игры:

public boolean saveGame(Chess chess) { 
    boolean error = false; 
    try { 

     File file = new File("game.save"); 
     FileOutputStream fis = new FileOutputStream(file); 
     ObjectOutputStream oos = new ObjectOutputStream(fis); 
     oos.writeObject(chess.getArray()); 
     oos.close(); 

     // Save that file in the server 
     FileInputStream fis = new FileInputStream(new File("game.save")); 
     client.storeFile("game.save", fis); 

     fis.close(); 
     file.delete(); 


    } catch (IOException e) { 

     e.printStackTrace(); 
    } 
    return error; 

Сохранение игры не дает мне никаких проблем и идет гладко.

И теперь это метод, который я использую для загрузки игры, которая бросает исключение invalidClassException.

try { 
      FileInputStream fis = new FileInputStream(new File("game.save")); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      chess.setArray((Piece[][]) ois.readObject()); 
      chess.paintInBoard(); 
      ois.close(); 
     } catch (IOException | ClassNotFoundException e) { 

      e.printStackTrace(); 
     } 

Всякий раз, когда я пытаюсь читать Матриз я получаю «java.io.InvalidClassException: [LPiece ;; недопустимый дескриптор для поля»

Я реализовал Serializable интерфейс в Кусок и шахматы. Я попытался сохранить весь шахматный класс, но при этом мне пришлось бы реализовать интерфейс Serializable в других 8 классах, и я стараюсь избегать этого. Должен ли я читать каждую пьесу отдельно?

Большое спасибо.

ответ

0

Я попытался сохранить сохраненные локально, и это сработало. Проблема заключалась в том, что сервер, который я использовал, испортил файл каждый раз, когда я его загрузил, предоставив мне это исключение. Смена сервера выполнила задание.

1

Трудно определить, что проблема может быть, потому что интерфейс Кусок, ни его исполнители классов не предусмотрено, но вот мои мысли по этой проблеме:

  1. лично я бы избежать сохранения массива или матрица. Вместо этого я сохранил бы части в классе контейнеров, например: PieceCollection.
  2. Я не вижу никакой конкретной проблемы с вашим предоставленным кодом (если chess.getArray() не возвращает что-то еще, чем кусок).
  3. Я считаю, что главная проблема здесь в том, что ObjectInputStream не может отличить различные реализации Piece. Я предлагаю вам попробовать добавить serialVersionUID в классы Piece. Для получения дополнительной информации см. Следующую ссылку: https://docs.oracle.com/javase/7/docs/platform/serialization/spec/class.html
  4. В классах Piece отсутствует конструктор no-arg. Дополнительную информацию см. По следующей ссылке: https://docs.oracle.com/javase/8/docs/api/index.html?java/io/InvalidClassException.html

Удачи вам! Надеюсь, этот ответ вам поможет.