java - 如何查看 java 序列化对象?

标签 java serialization

我有一个来自旧 Java 代码的对象,现在我更改了序列化的对象代码。我希望能够读取旧文件和新文件。我需要在 readObject 中使用分支语句来执行以下操作:

if (next object is int -- just poking, it might be an Object)
{
    // we know we are in version 1
} else {
    // read new version of object
}

这可能吗?

最佳答案

好吧,基本上问题是“我们如何检查 ObjectInputStream 下一个字段是原始字段还是对象?”据我所知,答案是:你不能。

这意味着我能看到的保持向后兼容性的最佳解决方案是从不从原始版本中删除原语——保留无用信息会稍微增加大小,但除此之外这很容易。

要添加新字段,我可以看到两种方式:

  1. 保持之前的消息格式相同,只在末尾添加新对象 - 然后您可以通过消息大小轻松区分不同版本(或者更准确地说,当您读取 v2 的数据时,您会得到一个 IOException v1 对象)。这要简单得多,而且通常是首选。

  2. 您可以将对象从 v1 更改为 v2,然后执行简单的 instanceof 检查。如果你想添加基元是存储它们的包装器版本(即 Integer 等)。可以为您节省一些字节,但 Java 的序列化协议(protocol)从一开始就不是高效的,所以真的没有必要复杂化。

关于java - 如何查看 java 序列化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10704424/

相关文章:

java - 使用 GridBagLayout 调整大小不当

java - 网络安全配置 : Using Network Security Config from resource network_security_config debugBuild: true

apache-spark - MapWithState 给出 java.lang.ClassCastException : org. apache.spark.util.SerializableConfiguration cannot be cast while recovering from checkpoint

Java 可序列化对象失败

java - 如何使用Gson序列化LocalDate?

java - 我需要一个类来对正常人群进行假设检验

java - 如何在处理中为数组列表中的每个值创建一个 block ?

java - org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException : Unauthorized

c# - Json反序列化失败

java - 如果 Java 中的对象驻留在不同的包中,则压缩和解压缩它们