如何识别我在序列化Java对象的最后一个字节?

时间:2009-05-19 00:34:12

标签: java serialization

问题

什么是(如果有的话)在序列化的java对象中终止字符/字节序列?

背景

我正在开展一个小型的自我教育项目,我希望将java对象序列化并将它们写入有读取然后未序列化的流中。因为,我需要识别序列化对象之间的边界,我不能确定当前对象不是最后一个,是否有一个终止字符,我可以用作我的标识符?

我注意到有一个幻数ACED允许我识别对象的开始,所以如何识别结束?

编辑: 如果没有终止字符,是否有任何安全终止字符/序列,我可以使用(插入)来识别对象的结尾?

4 个答案:

答案 0 :(得分:2)

理论上,你应该总能找到一个物体的末端,实际上你不能。我了解问题是自定义的writeObject实现,不会调用defaultReadObjectreadFields具有非标准表示。

我过去曾经玩过序列化。包括创建流,以便在我对ObjectInputStream执行异常操作时使用。这不愉快(!)。

您可以阅读spec中的详细信息,并且值得阅读。

答案 1 :(得分:1)

没有。 AFAIK唯一的要求是,当给定相应的序列化时,解串器知道何时停止读取。除此之外,序列化器可以写任何想要的东西 - 在任何位置而不仅仅是最后一个位置。

如果你是旧的skool在开始时转储一个32位长度的字段,拒绝处理大于4 gig的对象。

nu scool,您只需确保您的读取和写入逻辑一致,并且不关心长度。

答案 2 :(得分:1)

您可以向对象流添加终止对象。例如null或特殊字符串。

但是,我建议您将ObjectsStream转换为byte []并写入byte []的字节长度,后跟其数据。这样每个ObjectStream都是独立的,你总能知道它的完成位置。

答案 3 :(得分:0)

您是否考虑过应用类似于HTTP Chunked encoding的记录标记图层?

Chunked编码旨在解决这种情况的一般化:识别不确定长度的消息的结束,这两个消息本身不包含可识别的结束,并且嵌入在较长的流中而不结束它。