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

ark*_*ark 0 java serialization

我遇到以下代码问题.序列化对象似乎有效,但是当我尝试反序列化它时,方法in.available()立即返回0(它不会进入while循环).由于(de)序列化逻辑是从这里复制的,我想它应该可行.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

jta*_*orn 7

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

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