我创建了一个程序,这是一个猜谜游戏,但我在学习这种新方法序列化时遇到了问题。我已经完成了所有已经完成的工作,因此程序可以通过序列化方法保存并加载打开。我正在尝试序列化程序的“游戏”部分或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();
}
}
答案 0 :(得分:3)
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。可序列化类的所有成员必须自身可序列化才能使序列化工作。
的好教程答案 2 :(得分:0)
你的问题很广泛。 一个应该让你顺利的答案是,首先,你应该使你的Tree类实现java.io.Serializable:
类Tree实现Serializable { ... }
然后,确保所有字段Tree以相同的方式实现Serializable(依此类推其字段)
完成此操作后,您可以使用ObjectOutputStream将Tree实例写出来,使用ObjectInputStream来读取它。
E.g。 new ObjectOutputStream(new FileInputStream(“filename”))。writeObject(tree)
但是你需要先阅读一下Serializable和ObjectOutputSteam,我建议。