如果我尝试从文件加载旧版本的对象会怎样?
例如,如果我创建了一个对象,则使用FileOutputStream将该对象保存到文件中。然后,如果我添加了一个字段,并尝试重新加载此对象,Java将无法识别该对象,或者是否将该字段设置为默认字段或......?
谢谢:)
答案 0 :(得分:1)
当您尝试使用其他类版本反序列化您的类时,您应该会收到InvalidClassException
。来自javadocs:
序列化运行时与每个可序列化的类a关联 版本号,称为serialVersionUID,在此期间使用 反序列化以验证序列化的发送方和接收方 object已加载与该对象兼容的类 尊重序列化。如果接收器已加载了一个类 具有与其不同的serialVersionUID的对象 相应的发件人类,然后反序列化将导致 InvalidClassException。可序列化的类可以声明它自己的类 serialVersionUID通过声明一个名为的字段显式地显示 “serialVersionUID”必须是static,final和long类型:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;如果一个 serializable类没有显式声明serialVersionUID, 然后序列化运行时将计算默认值 该类的serialVersionUID值基于该方面的各个方面 class,如Java(TM)对象序列化中所述 规格。但是,强烈建议所有人 可序列化类显式声明serialVersionUID值,因为 默认的serialVersionUID计算对类非常敏感 细节可能因编译器实现而异,并且可以 因此导致意外的InvalidClassExceptions期间 反序列化。因此,要保证一致的serialVersionUID 不同java编译器实现的值,可序列化 class必须声明一个显式的serialVersionUID值。也是 强烈建议显式serialVersionUID声明使用 尽可能使用私有修饰符,因为此类声明仅适用于 立即声明的类 - serialVersionUID字段不是 作为继承成员有用。
答案 1 :(得分:1)
您很可能会遇到异常,因为文件中存储的serialVersionUID与当前版本的类型不匹配。
默认情况下,Java只会出错。
如果您想提供阅读“旧版本”的方法,则必须implement the readObject method。
在序列化和反序列化过程中需要特殊处理的类必须使用这些精确签名实现特殊方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;