美文网首页
Java 使用 ObjectStream 时的注意事项

Java 使用 ObjectStream 时的注意事项

作者: 字母数字或汉字 | 来源:发表于2016-05-04 18:39 被阅读259次

    在向下阅读之前,请注意 JavaBean 要实现 Serializable 接口。

    初始化时发生了什么?

    ObjectOutputStream 初始化时会送出其 header 数据给对端。
    ObjectInputStream 初始化时会阻塞地接收来自对端的 header 数据。

    发现了吗,这可能会有两处问题。

    1. 两端的输入和输出流的初始化的顺序不互恰,导致在 ObjectInputStream 的初始化阶段发生阻塞。
    2. 某端的输入或输出流和对端的输出或输入流初始化的次数不同,导致阻塞或对端收到错误数据报异常。

    对 (1) 我们只要保证两端互恰即可。

    // server
    oos = new ObjectOutputStream(socket.getOutputStream());
    ois = new ObjectInputStream(socket.getInputStream());
    
    // client
    ois = new ObjectInputStream(socket.getInputStream());
    oos = new ObjectOutputStream(socket.getOutputStream());
    

    对 (2) 我们要保证两端初始化的逻辑一致。

    一般用法示例

    简单举例,也是给自己做个备忘。

    数据包

    import java.io.Serializable;
    
    public class PersonBean implements Serializable {
        public String name = null;
    }
    

    ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
    PersonBean person = (PersonBean) input.readObject();
    

    PersonBean person = new PersonBean();
    person.name = "name";
    
    ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
    output.writeObject(person);
    output.flush(); // 如果不刷新,则 ObjectOutputStream 会缓存上一个对象的引用,导致每次都送出的是同一个。
    

    相关文章

      网友评论

          本文标题:Java 使用 ObjectStream 时的注意事项

          本文链接:https://www.haomeiwen.com/subject/ccarrttx.html