Java 从文件加载对象的旧版本
如果我尝试从文件加载对象的旧版本,会发生什么 例如,如果我创建了一个对象,然后使用FileOutputStream将该对象保存到一个文件中。那么,如果我添加了一个字段,并试图重新加载这个对象,Java会不会根本无法识别这个对象,或者它会将字段设置为默认值,或者Java 从文件加载对象的旧版本,java,read-write,Java,Read Write,如果我尝试从文件加载对象的旧版本,会发生什么 例如,如果我创建了一个对象,然后使用FileOutputStream将该对象保存到一个文件中。那么,如果我添加了一个字段,并试图重新加载这个对象,Java会不会根本无法识别这个对象,或者它会将字段设置为默认值,或者 谢谢:)当您尝试用不同的类版本反序列化类时,应该会收到一个InvalidClassException。从: 序列化运行时与每个可序列化类关联 版本号,称为serialVersionUID,在 反序列化以验证序列化的发送方和接收方 对象已为
谢谢:)当您尝试用不同的类版本反序列化类时,应该会收到一个
InvalidClassException
。从:
序列化运行时与每个可序列化类关联
版本号,称为serialVersionUID,在
反序列化以验证序列化的发送方和接收方
对象已为该对象加载与兼容的类
关于序列化。如果接收器已为
对象的SerialVersionId与的SerialVersionId不同
对应发件人的类,则反序列化将导致
InvalidClassException。可序列化类可以声明自己的类
通过声明名为
“serialVersionUID”必须是静态的、最终的且类型为long:
ANY-ACCESS-MODIFIER静态最终长serialVersionUID=42L;如果
serializable类未显式声明serialVersionUID,
然后序列化运行时将计算默认值
该类的SerialVersionId值基于
类,如Java(TM)对象序列化中所述
规范。但是,强烈建议:
可序列化类显式声明serialVersionUID值,因为
默认的serialVersionUID计算对类高度敏感
详细信息可能因编译器实现而异,可以
因此,在运行期间会导致意外的InvalidClassException
反序列化。因此,要保证一致的serialVersionUID
跨不同java编译器实现的值,可序列化
类必须声明显式的SerialVersionId值。也是
强烈建议显式serialVersionUID声明使用
私有修饰符,因为此类声明仅适用于
立即声明的类--SerialVersionId字段不可用
作为继承成员使用
您很可能会遇到异常,因为文件中存储的serialVersionUID与类的当前版本不匹配 默认情况下,Java只会出错 如果你想提供一种阅读“旧版本”的方法,你必须这样做 在序列化和反序列化过程中需要特殊处理的类必须使用以下精确签名实现特殊方法:
我猜它可能无法加载,可能版本冲突?你试过了吗,结果如何?它肯定不会加载(如果你尝试了一些东西而不是发布一个问题,你会注意到这个=])。如果要使序列化对象向后兼容,请在
Serializable
类上添加并实现readObject
和writeObject
。
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;