如何确定我位于序列化Java对象的最后一个字节?

如何确定我位于序列化Java对象的最后一个字节?,java,serialization,Java,Serialization,问题: 序列化java对象中的终止字符/字节序列是什么(如果有) 背景 我正在进行一个小型的自我教育项目,在这个项目中,我想序列化java对象,并将它们写入一个流,在该流中进行读取,然后进行非序列化。因为,我需要识别序列化对象之间的边界,并且我不能确定当前对象不是最后一个对象,所以是否有一个始终存在的终止字符可以用作标识符 我注意到有一个神奇的数字ACED,它允许我识别对象的开始,那么我如何识别结束呢 编辑: 如果没有终止字符,是否有任何安全的终止字符/序列可用于(插入)标识对象的结尾?理论上,

问题:

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

背景

我正在进行一个小型的自我教育项目,在这个项目中,我想序列化java对象,并将它们写入一个流,在该流中进行读取,然后进行非序列化。因为,我需要识别序列化对象之间的边界,并且我不能确定当前对象不是最后一个对象,所以是否有一个始终存在的终止字符可以用作标识符

我注意到有一个神奇的数字ACED,它允许我识别对象的开始,那么我如何识别结束呢

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

理论上,您应该始终能够找到对象的结尾,但实际上,您无法找到。我知道问题是定制的
writeObject
实现,这些实现既不调用
defaultReadObject
也不调用
readFields
,但具有非标准表示形式

我过去一直在玩连续剧。包括创建流,以便在我对
ObjectInputStream
做了不寻常的事情时使用。这不愉快


您可以在中读取详细信息,并且源代码值得一读。

理论上,您应该始终能够找到对象的结尾,但实际上您无法找到。我知道问题是定制的
writeObject
实现,这些实现既不调用
defaultReadObject
也不调用
readFields
,但具有非标准表示形式

我过去一直在玩连续剧。包括创建流,以便在我对
ObjectInputStream
做了不寻常的事情时使用。这不愉快


您可以在中读取详细信息,源代码值得一读。

您是否考虑过应用类似的记录标记层


分块编码旨在解决这种情况的泛化:识别长度不确定的消息的结尾,该消息本身不包含可识别的结尾,并且嵌入到较长的流中而不结束它。

您是否考虑过应用类似的记录标记层


分块编码旨在解决这种情况的泛化:识别长度不确定的消息的结尾,该消息本身不包含可识别的结尾,并且嵌入到较长的流中而不结束。

没有结尾。唯一的要求是,当给定相应的序列化时,反序列化程序知道何时停止读取。在这种情况下,序列化程序可以写任何它想要的东西——在任何位置,而不仅仅是最后一个位置

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


nu scool,您只需确保您的读写逻辑一致,而不关心长度。

没有。唯一的要求是,当给定相应的序列化时,反序列化程序知道何时停止读取。在这种情况下,序列化程序可以写任何它想要的东西——在任何位置,而不仅仅是最后一个位置

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


nu scool,您只需确保读写逻辑一致,而不关心长度。

您可以将终止对象添加到对象流中。e、 g.null或特殊字符串


但是,我建议您将ObjectsStream转换为byte[],并写入byte[]的字节长度,后跟其数据。这样,每个对象流都是独立的,您总是知道它在哪里结束。

您可以向对象流添加终止对象。e、 g.null或特殊字符串


但是,我建议您将ObjectsStream转换为byte[],并写入byte[]的字节长度,后跟其数据。这样,每个ObjectStream都是独立的,您总是知道它在哪里结束。

当前流后面的字节不存在?:P@Lou因为这个流可能是一个网络流,我们可能会在某个地方阻塞。因此,“不存在”应该只有在我们到达流的末尾时才起作用。卢:一个对象末尾后的字节将是下一个对象的第一个字节。当前对象后面的字节不存在P@Lou因为这个流可能是一个网络流,我们可能会在某个地方阻塞。因此,“不存在”应该只有在我们到达流的结尾时才起作用。卢:一个对象结尾后的字节将是下一个对象的第一个字节。既然字节长度和实际数据存在于同一数组中,您如何区分它们呢?@foobar您总是将长度放在第一位,那么你就知道长度在起始处。既然字节长度和实际数据存在于同一个数组中,你如何区分它们呢?@foobar你总是把长度放在第一位,那么你就知道长度在起始处。