什么是UID用于的串行版本?

时间:2014-02-04 20:19:36

标签: java exception stack uid

我正在创建一个Java应用程序,在创建用于ADT的接口时,它会发现需要将随机数初始化为ID号。

public class StackFullException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    public StackFullException(){}
    public StackFullException(String message) {
        super(message);
    }
}

我很好奇这样做是否会影响我的程序,如果是的话,如何避免它。

5 个答案:

答案 0 :(得分:9)

serialVersionUID是Java序列化API的黑魔法的一部分。

它用于唯一标识类的版本,以便在对类进行反序列化时,可以根据ClassLoader加载的类的版本检查版本。

序列化API本身会生成serialVersionUID,如果没有指定,但随后会因无关紧要的更改(或至少不会破坏序列化兼容性)而随机更改。

自己添加字段可让您控制此过程 - 您可以决定何时对类进行更改会破坏旧版本的反序列化。

更多信息可在JavaDocs for Serializable

中找到

简而言之,如果您计划序列化此类,然后在以后对其进行反序列化 - 但在对代码进行一些更改并重新编译之后 - 这个字段或多或少必不可少,以确保它能按预期工作。

答案 1 :(得分:2)

Serializable界面提供了足够的细节:

  

序列化运行时与每个可序列化的类a关联   版本号,称为serialVersionUID,在期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与{1}不同的serialVersionUID的对象   相应的发件人类,然后反序列化将导致   InvalidClassException。可序列化的类可以声明它自己的类   serialVersionUID明确声明一个名为的字段   “serialVersionUID”必须为staticfinal,类型为long

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;   
     

如果可序列化的类没有显式声明serialVersionUID,   然后序列化运行时将计算默认值   该类的serialVersionUID值基于该方面的各个方面   class,如 Java(TM)对象序列化中所述   说明书。但是,强烈建议所有人   可序列化类显式声明serialVersionUID值,因为   默认的serialVersionUID计算对类非常敏感   细节可能因编译器实现而异,并且可以   因此导致意外InvalidClassExceptions期间   反序列化。因此,要保证一致serialVersionUID   不同java编译器实现的值,可序列化   class必须声明一个明确的serialVersionUID值。

您也可以在Java Object Serialization Specification

中详细了解相关信息

答案 2 :(得分:1)

searialVersionUID只是您在界面上放置的版本号,以便知道它与相同的API进行通信。换句话说,如果客户端的Java对象是“1L”而服务器是“2L”,那么它将抛出错配。

答案 3 :(得分:1)

此上下文中的UID也可用于区分写入磁盘的两个对象。

来源:http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/

正如其他人所说,UID是可选的,不应该影响你的程序。

答案 4 :(得分:0)

当用于JDK的序列化时,它用于反映类的结构更改。它完全是可选的。就个人而言,我从不创建这样的字段,并且经常在找到它们时删除它们。