我在序列化方面遇到麻烦,我需要在java中实现它

时间:2012-03-29 19:42:16

标签: java serialization

我创建了一个程序,这是一个猜谜游戏,但我在学习这种新方法序列化时遇到了问题。我已经完成了所有已经完成的工作,因此程序可以通过序列化方法保存并加载打开。我正在尝试序列化程序的“游戏”部分或play()方法,以便下次加载时它将加载旧信息。

 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();



 }

}

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

我发现代码存在两个问题。

首先,您的Tree实现了Serializable,但这还不够。您需要告诉程序(可能在程序启动后的早期),读取序列化文件,并从该输入流初始化Tree。相反,当您准备好保存状态时(可能在程序退出之前),您需要将树写入序列化文件。

其次,您的Tree实现了Serializable,但您的树是由Node对象构建的,这些对象不实现Serializable。可序列化类的所有成员必须自身可序列化才能使序列化工作。

关于Java Serialization

的好教程

答案 2 :(得分:0)

你的问题很广泛。 一个应该让你顺利的答案是,首先,你应该使你的Tree类实现java.io.Serializable:

类Tree实现Serializable { ... }

然后,确保所有字段Tree以相同的方式实现Serializable(依此类推其字段)

完成此操作后,您可以使用ObjectOutputStream将Tree实例写出来,使用ObjectInputStream来读取它。

E.g。 new ObjectOutputStream(new FileInputStream(“filename”))。writeObject(tree)

但是你需要先阅读一下Serializable和ObjectOutputSteam,我建议。