我正在创建一个Java应用程序,在创建用于ADT的接口时,它会发现需要将随机数初始化为ID号。
public class StackFullException extends RuntimeException {
private static final long serialVersionUID = 1L;
public StackFullException(){}
public StackFullException(String message) {
super(message);
}
}
我很好奇这样做是否会影响我的程序,如果是的话,如何避免它。
答案 0 :(得分:9)
serialVersionUID
是Java序列化API的黑魔法的一部分。
它用于唯一标识类的版本,以便在对类进行反序列化时,可以根据ClassLoader
加载的类的版本检查版本。
序列化API本身会生成serialVersionUID
,如果没有指定,但随后会因无关紧要的更改(或至少不会破坏序列化兼容性)而随机更改。
自己添加字段可让您控制此过程 - 您可以决定何时对类进行更改会破坏旧版本的反序列化。
更多信息可在JavaDocs for Serializable
。
简而言之,如果您计划序列化此类,然后在以后对其进行反序列化 - 但在对代码进行一些更改并重新编译之后 - 这个字段或多或少必不可少,以确保它能按预期工作。
答案 1 :(得分:2)
Serializable
界面提供了足够的细节:
中详细了解相关信息序列化运行时与每个可序列化的类a关联 版本号,称为
serialVersionUID
,在期间使用 反序列化以验证序列化的发送方和接收方 object已加载与该对象兼容的类 尊重序列化。如果接收器已加载了一个类 具有与{1}不同的serialVersionUID
的对象 相应的发件人类,然后反序列化将导致InvalidClassException
。可序列化的类可以声明它自己的类serialVersionUID
明确声明一个名为的字段 “serialVersionUID”必须为static
,final
,类型为long
:ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化的类没有显式声明
serialVersionUID
, 然后序列化运行时将计算默认值 该类的serialVersionUID
值基于该方面的各个方面 class,如 Java(TM)对象序列化中所述 说明书。但是,强烈建议所有人 可序列化类显式声明serialVersionUID值,因为 默认的serialVersionUID计算对类非常敏感 细节可能因编译器实现而异,并且可以 因此导致意外InvalidClassExceptions
期间 反序列化。因此,要保证一致serialVersionUID
不同java编译器实现的值,可序列化 class必须声明一个明确的serialVersionUID
值。
答案 2 :(得分:1)
searialVersionUID只是您在界面上放置的版本号,以便知道它与相同的API进行通信。换句话说,如果客户端的Java对象是“1L”而服务器是“2L”,那么它将抛出错配。
答案 3 :(得分:1)
此上下文中的UID也可用于区分写入磁盘的两个对象。
来源:http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/
正如其他人所说,UID是可选的,不应该影响你的程序。
答案 4 :(得分:0)
当用于JDK的序列化时,它用于反映类的结构更改。它完全是可选的。就个人而言,我从不创建这样的字段,并且经常在找到它们时删除它们。