我遇到以下代码问题。序列化对象似乎有效,但是当我尝试反序列化它时,方法in.available()立即返回0(它不会进入while循环)。由于(de)序列化逻辑是从here复制的,我想它应该可以工作。
public class test {
public static enum Direction {NONE, UP, DOWN, LEFT, RIGHT}
/**
* @param args
*/
public static void main(String[] args) {
LinkedList<Node> list = new LinkedList<Node>();
list.add(new Node(1.0, 0));
list.add(new Node(2.0, 0));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out;
try {
out = new ObjectOutputStream(baos);
for(Node l:list)
out.writeObject(l);
baos.close();
out.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInput in;
in = new ObjectInputStream(bais);
while (in.available() > 0) {
Node l = (Node) in.readObject();
}
bais.close();
in.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
class Node implements Serializable {
double val;
int index;
public Node(double val, int index) {
this.val=val;
this.index=index;
}
}
答案 0 :(得分:7)
不要使用InputStream.available()
。它几乎永远不会做你想要它做的事情。你基本上必须只调用readObject并捕获当没有更多数据要读取时抛出的IOException(可能是EOFException的一个实例)。
或者,您可以先使用您拥有的节点数调用ObjectOutputStream.writeInt()
,然后使用ObjectInputStream.readInt()
读取该节点,以便了解预期的节点数。