2012-03-29 1 views
2

Я создал программу, это игра с угадыванием, но у меня возникают проблемы с изучением этого нового метода для его сериализации. У меня все уже сделано, мне просто нужно сделать так, чтобы программа могла сохранять и загружать открытые с помощью метода сериализации. Я пытаюсь выполнить сериализацию «игровой» части или метода play() программы, поэтому, когда в следующий раз она загрузит ее, она будет загружать старую информацию.У меня возникли проблемы с сериализацией, мне нужно реализовать его в java

import javax.swing.JOptionPane; 
import java.io.Serializable; 
import java.io.ObjectOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

//Node class 
class Node 
{ 
//instance variables 
public String questionText; 
public Node leftChild; 
public Node rightChild; 

public void displayText() 
{ 
    System.out.println(questionText); 
} 
} 


    //Tree class 
class Tree implements Serializable 
{ 
private Node root; 

//constructor 
public Tree() 
{ root = new Node(); 
    root.leftChild = new Node(); 
    root.rightChild = new Node(); 
    root.questionText = "Does it live on land?"; 
    root.leftChild.questionText ="bear"; // left side is Yes, right side is No 
    root.rightChild.questionText = "parrot"; 
} 

public void instruction() 
{ 
    JOptionPane.showMessageDialog(null, "Think of an animal, I will try to guess it, answer yes or no"); 
} 


public void play() 
{ 
Node current = root; 
Node parent = current; 
boolean isLeftChild = true; 


while(true) 
{ parent = current; 
    int response = JOptionPane.showConfirmDialog(null,current.questionText); 
    //code here for yes 
    if (response == JOptionPane.YES_OPTION) 
    { 
     current = current.leftChild; 
     isLeftChild=true; 
    } 
    //code here for no 
    else if (response == JOptionPane.NO_OPTION) 
    { 
     current = current.rightChild; 
     isLeftChild = false; 
    } 


    if (current.leftChild == null && current.rightChild == null) 
    { 
     int secondQ = JOptionPane.showConfirmDialog(null, "Is your animal a " + current.questionText + "?"); 

     if (secondQ == JOptionPane.YES_OPTION) 
     { 
      JOptionPane.showMessageDialog(null,"I Guessed your animal!"); 
      return; 
     } 
     else if (secondQ == JOptionPane.NO_OPTION) 
     { 
      Node nodeOne = new Node(); 
      Node nodeTwo = new Node(); 

       nodeOne.questionText = JOptionPane.showInputDialog("Write a question that differentiates your animal from the animal I guessed, it would be yes for your animal"); 

       nodeTwo.questionText = JOptionPane.showInputDialog("What is this animal?"); 

       nodeOne.rightChild = current; 
       nodeOne.leftChild = nodeTwo; 

       // parent.leftChild = nodeOne or parent.rightChild = nodeOne 
       if(isLeftChild == false) 
       { 
        parent.rightChild = nodeOne; 
        System.out.println("right child"); 
       } 
       else 
        { 
        parent.leftChild = nodeOne; 
        System.out.println("left Child"); 
        } 
       return; 




     } 


    } 

} 
} 


public void preOrder(Node localRoot) 
{ 
if(localRoot != null) 
    { 
    System.out.print(localRoot.questionText + " "); 
    preOrder(localRoot.leftChild); 
    preOrder(localRoot.rightChild); 
    } 
} 

public Node getRoot(){ 
    return root; 
} 
} 




public class GuessTheAnimal 
{ 
    public static void main(String[] args) 
{ 
    Tree animal = new Tree(); 
    animal.instruction(); 
    animal.play(); 
    animal.play(); 



} 

} 
+0

В чем именно проблема? – bvulaj

+0

Я не знаю, как его реализовать, и вам нужна помощь. – Renuz

ответ

3

Я предлагаю Java serialization:

FileOutputStream fileOut = 
new FileOutputStream("node.ser"); 
ObjectOutputStream out = new ObjectOutputStream(fileOut); 
out.writeObject(tree); 
out.close(); 

Чтение так же легко:

FileInputStream fileIn = new FileInputStream("employee.ser"); 
ObjectInputStream in = new ObjectInputStream(fileIn); 
tree = (Tree) in.readObject(); 
in.close(); 
+0

+1 не нужно для 'fileIn.close();' и 'fileOut.close();', так как 'in.close();' и 'out.close();' закроет их для вас. :) –

+0

Есть ли место, где я бы положил это? В пределах класса Tree, до и после? – Renuz

+0

В основном методе, ИМО. Это трудно сказать, хотя и без более твердых требований к тому, что вы пытаетесь сделать. – jsight

1

Я вижу две проблемы с кодом.

Во-первых, ваше дерево реализует Serializable, но этого недостаточно. Вы должны сообщить программе (возможно, на ранней стадии после запуска программы), прочитать ваш сериализованный файл и инициализировать свое дерево из этого входного потока. И наоборот, когда вы готовы сохранить свое состояние (вероятно, прямо перед выходом программы), вам нужно записать свой Tree в свой сериализованный файл.

Во-вторых, ваше дерево реализует Serializable, но ваше дерево построено из объектов Node, которые не реализуют Serializable. Все члены вашего сериализуемого класса должны быть сериализованы для работы Serialization.

Хороший учебник по Java Serialization

+0

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

0

Ваш вопрос достаточно широк. Ответ, который должен получить вас на вашем пути является то, что во-первых, вы должны сделать ваш класс Дерево реализации java.io.Serializable:

класс Дерево реализует Serializable { ... }

Затем убедитесь, все поля Tree реализуют Serializable таким же образом (и так далее для своих полей)

Когда это будет сделано, вы можете использовать ObjectOutputStream для записи экземпляра Tree Tree и ObjectInputStream для его чтения.

E.g. новый ObjectOutputStream (новый FileInputStream («filename»)). writeObject (дерево)

Но вы должны сначала прочитать о Serializable и ObjectOutputSteam, я бы предложил.

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