2014-01-27 2 views
0

Следующего кода два метода, один для сохранения в файл с помощью сериализации объектов и один для загрузки и десериализации сохраненного файла для пользователя, чтобы читать:Загрузка массива объектов с помощью Java Сериализации

private void SaveDeck() throws Exception { 
    ObjectOutputStream oos = null; 
    FileOutputStream fout = null; 
    try{ 
     fout = new FileOutputStream(filePath, true); 
     oos = new ObjectOutputStream(fout); 
     oos.writeObject(theDeck); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    }finally { 
     if(oos != null){ 
      oos.close(); 
     } 
    } 
} 

private FlashCardDeck[] loadDeck(){ 
    user.setDeckMade(true); 
    try { 
     FileInputStream fis = new FileInputStream(filePath); 
     ObjectInputStream in = new ObjectInputStream(fis); 
     this.theDeck = (FlashCardDeck[])in.readObject(); 
     in.close(); 
    } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
    return theDeck; 
} 

В ошибка я получаю от метода загрузки:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: myPackage.UserInterface

Saving работает отлично; Я открыл файл .ser после того, как метод SaveDeck выполнил, и все, казалось, правильно проверено.

Мой вопрос в том, связана ли проблема с самим файлом, методом сохранения или внешними методами? Я убедился, что все не сериализуемое (а именно, класс Scanner) является временным.

package myPackage.FlashCards; 

import java.io.Serializable; 

public class FlashCardDeck implements Serializable{ 


private static final long serialVersionUID = -1176413113990886560L; 
public FlashCard[] theDeck; 
public String deckName; 


public FlashCardDeck(int cards, String name) { 
    this.deckName = name; 
    theDeck = new FlashCard[cards]; 
    for (int i = 0; i < theDeck.length; i++) { 
     theDeck[i] = new FlashCard(i); 
    } 
} 

public String getQuestion(int i) { 
    return theDeck[i].QuestionToString(); 
} 

public String getAnswer(int i) { 
    return theDeck[i].AnswerToString(); 
} 

public String getName() { 
    return deckName; 
} 

public int getDeckSize() { 
    return theDeck.length; 
} 


} 


package myPackage.FlashCards; 

import java.io.Serializable; 
import java.util.Scanner; 


public class FlashCard implements Serializable{ 

private static final long serialVersionUID = -8880816241107858648L; 

private transient Scanner in = new Scanner(System.in); 

String question; 
String answer; 

public FlashCard(int i) { 
    setCard(i); 
} 

public void setCard(int cards) { 
    System.out.println("What is the question for number " + (cards + 1) + "?"); 
    question = in.nextLine(); 
    System.out.println("What is the answer for number " + (cards + 1) + "?"); 
    answer = in.nextLine(); 

} 

public String QuestionToString() { 
    return "Question: " + question; 
} 

public String AnswerToString() { 
    return "Answer: " + answer; 
} 




} 


package myPackage.FlashCards; 

import java.io.Serializable; 
import java.util.InputMismatchException; 
import java.util.Scanner; 


public class UserInterface implements Serializable{ 

private static final long serialVersionUID = 7755668511730129821L; 
private int moreThanOnce = 0; 
boolean deckMade = false; 

private transient Scanner in = new Scanner(System.in); 

public int AmountOfDecks() { 
    int decks; 
    System.out.println("How many decks will you be creating? (Type the number, 
      not the word. Ex: 2)"); 
    decks = in.nextInt(); 
    while (decks <= 0) { 
     System.out.println("You can't have less than one deck! Try again."); 
     decks = in.nextInt(); 
    } 
    return decks; 
} 


public int StartMenu() { 
    int choice = 0; 
    moreThanOnce++; 
    if (moreThanOnce > 1) { 
     choice = SecondMenu(); 
    } else { 

     System.out.println("\nFlash Card Creation Engine Ver. 2.5 ALPHA"); 
     System.out.println("Press the cooresponding number for your 
        choice."); 
     System.out.println("1. Make a deck of flash cards"); 
     System.out.println("2. Play flash cards"); 
     System.out.println("3. Quit \n"); 

     try { choice = in.nextInt(); } catch (InputMismatchException ime) {} 
    } 

    return choice; 
} 

public int AmountOfCards(int cards) { 
    int catchMe; 
    deckMade = true; 
    System.out.println("How many cards would you like? (Type the number, not the 
      word. Ex: 2)"); 
    try { 
     catchMe = in.nextInt(); 
     while (catchMe <= 0) { 
      System.out.println("You can't have less than one card! Try 
          again!"); 
      catchMe = in.nextInt(); 
     } 
    } catch (Exception ime) { 
     System.out.println("Uh-oh, you did that wrong! Let's try that again. 
        Try typing: 3"); 
     cards = 0; 
     catchMe = in.nextInt(); 
    } 

    cards = catchMe; 
    return cards; 
} 

public boolean getDeckMade() { 
    return deckMade; 
} 

public void setDeckMade(boolean makeDeckMade) { 
    this.deckMade = makeDeckMade; 
} 

public String NameOfDeck() { 
    String name; 
    System.out.println("What would you like to name this deck?"); 
    name = in.next(); 
    return name; 
} 

private int SecondMenu() { 
    int choice = 0; 
    System.out.println("Now what would you like to do?"); 
    if (deckMade) { 
     System.out.println("1. Make or load a deck of flash cards -- DONE"); 
    } else { 
     System.out.println("1. Make a deck of flash cards."); 
    } 
    System.out.println("2. Play flash cards"); 
    System.out.println("3. Quit \n"); 

    try { choice = in.nextInt(); } catch (InputMismatchException ime) {} 
    return choice; 
} 

public boolean SetMode() { 
    boolean timed = false; 
    int userChoice = 0; 
    while (userChoice < 1 || userChoice > 2) { 
     System.out.println("What mode are you selecting?"); 
     System.out.println("1. Timed"); 
     System.out.println("2. Normal"); 
     System.out.println("3. Help"); 
     System.out.println("4. Quit"); 
     userChoice = in.nextInt(); 
     if (userChoice == 1) { 
      timed = true; 
     } else if (userChoice == 3) { 
      System.out.println("Timed: Answers to a flash card will 
          appear after a set amount of seconds, then show the next 
          question after the same amount of seconds, which are set by 
          the user (that's you!)"); 
      System.out.println("Normal: Answers to a flash card will 
          appear when the user (also you!) presses enter, and wait for 
          enter to be pressed before showing the next question."); 
     } else if (userChoice == 4) { 
      System.out.println("Have a good day."); 
      System.exit(0); 
     } else { 
      System.out.println("Choose from the proivded list -- 1 for 
          Timed mode, 2 for Normal mode, 3 to show the Help menu, 4 to 
          quit."); 
      System.out.println(); 

     } 
    } 

    return timed; 
} 

public String setQuestion(int cards) { 
    String question = ""; 

    return question; 

} 

public String setAnswer(int cards) { 
    String answer = ""; 
    return answer; 
} 


} 
+0

А как выглядит класс 'FlashCardDeck'? –

+0

Вы можете вставить полный класс – Kick

ответ

0

Класс, который вы пытаетесь сериализовать (и любые объекты, не имеющие переход к этому объекту, на которые ссылается этот класс) должен реализовать интерфейс Serializable.

Судя по ошибке, у вас есть класс UserInterface, на который есть ссылки, который не является сериализуемым.

Edit:

Также

new FileOutputStream(filePath, true); 

всегда присоединяет к концу файла вместо очистки файла. У вас могут быть более старые данные в файле, который не десериализован правильно. Вы можете попробовать удалить файл и повторить попытку.

В целом - добавление различных объектов в файл может быть плохим выбором, учитывая повреждение данных. Если разные файлы для каждой колоды не являются опцией, я могу пойти для отдельного объекта DeckStore, который содержит все колоды и сериализуется в целом.

+0

UserInterface реализовал Serializable с serialVersionUID. – user2943659

+0

Только после того, как вы его исправили. Созданный вами поток до его исправления по-прежнему поврежден, и вам все равно придется воссоздать его с допустимой версией класса. – EJP

0

класс, который вы хотите сериализовать должен реализовать SERIALIZABLE интерфейса

public class FlashCardDeck implements Serializable { 

    // Fields and methods of the class ... 
} 

Интерфейс сериализации не имеют методов или полей и служит только для определения семантики бытия сериализации.

+0

У меня также есть serialVersionUID для класса. – user2943659

+1

Возможно, у вас есть ссылка/поле в вашем классе FlashCardDeck, который не реализует Serializable. Вероятно, это класс UserInterface? – Armen

Смежные вопросы