ois.readObject()读取时如何判断边界

问题描述 投票:0回答:1

如果发送方使用

ois.writeObject
连续向接收方发送两个相同类的对象,接收方使用
oos.readObject
读取,是否可以让接收方将这两个数据包视为一个数据包?而当要序列化的类非常多时,接收方如何知道接收完成呢?

有方法指出

Object
可以作为界标,不知道对不对

//sender
out.writeObject(obj1);
out.writeObject(new Object()); 


out.writeObject(obj1);
out.writeObject(new Object()); 


//receiver
Object obj;
while ((obj = in.readObject()) != null) {
    if (obj instanceof Object) {
        // Boundary identification, process the next object
    } else {
        // process the received object
    }
}
java objectinputstream objectoutputstream
1个回答
0
投票

但是我在想有没有必要设计一个应用层协议让接收者区分消息的边界

Java Serialization 会为你做这些。如果 Java 序列化不这样做,就不可能从一个

Object
中读取一个以上的
ObjectInputStream
,因为对象之间的边界是未指定的。如果您对 Java 序列化如何做到这一点感到好奇,Java 对象序列化规范,特别是对象序列化流协议部分,应该证明是有指导意义的(非常简单:可变长度数据以其长度为前缀)。

也就是说,使用 Java 序列化来解释不受信任的数据很可能会导致 严重的安全漏洞。大多数网络软件最好使用更强大的序列化格式,例如 JSON 或 XML。这两个都有开源库。

或者,您可以使用裸体

DataOutputStream
/
DataInputStream
重新发明轮子。对于比较简单的消息,这应该不会太繁琐。

© www.soinside.com 2019 - 2024. All rights reserved.