为什么这个对象序列化不起作用?

时间:2011-04-18 20:40:40

标签: java serialization

我遇到以下代码问题。序列化对象似乎有效,但是当我尝试反序列化它时,方法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;
    }
}

1 个答案:

答案 0 :(得分:7)

不要使用InputStream.available()。它几乎永远不会做你想要它做的事情。你基本上必须只调用readObject并捕获当没有更多数据要读取时抛出的IOException(可能是EOFException的一个实例)。

或者,您可以先使用您拥有的节点数调用ObjectOutputStream.writeInt(),然后使用ObjectInputStream.readInt()读取该节点,以便了解预期的节点数。