为什么我们在java类中声明serialVersionUID
?在普通 Java类中声明serialVersionUID
有什么用。
class Simple
{
public static final long serialVersionUID=1L;
}
答案 0 :(得分:0)
Java提供了一种称为对象序列化的机制,其中对象可以表示为包含对象数据的字节序列,以及有关对象类型和对象中存储的数据类型的信息。
将序列化对象写入文件后,可以从文件中读取并反序列化,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。
答案 1 :(得分:0)
serialVersionUID is for Serialization Purpose.
private static final long serialVersionUID = 1L;
没有serialVersionUID有时会遇到SerialzationException。参考java.io.Serializable
答案 2 :(得分:0)
你无法获得比java.io.Serializable的文档更好的解释:
序列化运行时与每个可序列化的类a关联 版本号,称为serialVersionUID,在此期间使用 反序列化以验证序列化的发送方和接收方 object已加载与该对象兼容的类 尊重序列化。如果接收器已加载了一个类 具有与其不同的serialVersionUID的对象 相应的发件人类,然后反序列化将导致 InvalidClassException。可序列化的类可以声明它自己的类 serialVersionUID通过声明一个名为的字段显式地显示 “serialVersionUID”必须是static,final和long类型:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类没有显式声明a serialVersionUID,然后序列化运行时将计算一个 基于各个方面的该类的默认serialVersionUID值 该类的类,如Java(TM)对象序列化中所述 规格。但是,强烈建议所有人 可序列化类显式声明serialVersionUID值,因为 默认的serialVersionUID计算对类非常敏感 细节可能因编译器实现而异,并且可以 因此导致意外的InvalidClassExceptions期间 反序列化。因此,要保证一致的serialVersionUID 不同java编译器实现的值,可序列化 class必须声明一个显式的serialVersionUID值。也是 强烈建议显式serialVersionUID声明使用 尽可能使用私有修饰符,因为此类声明仅适用于 立即声明的类 - serialVersionUID字段不是 作为继承成员有用。