为啥Java忽略我的serialVersionUID?

Posted

技术标签:

【中文标题】为啥Java忽略我的serialVersionUID?【英文标题】:Why is Java Ignoring My serialVersionUID?为什么Java忽略我的serialVersionUID? 【发布时间】:2020-11-07 13:35:14 【问题描述】:

我有一个定义public static final Long serialVersionUID = 123L;的类。

当我实际序列化它时,或者即使我通过 Java 的 serialver.exe 运行它,它也会返回一个任意自动生成的 serialVersionUID,这取决于编译时的方法签名,或者 Java 通常派生这些。

为什么 Java 会忽略我明确指定的 serialVersionUID,我怎样才能让它停止?

编辑:这是一个最小示例,它也演示了上述行为。

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>demonstration</groupId>
    <artifactId>serialization</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

src/main/java/demonstration/serialization/Example.java:

package demonstration.serialization;

import java.io.Serializable;

public class Example implements Serializable 
        private static final Long serialVersionUID = 123L;

执行mvn clean package 以创建输出 jar,然后运行以下命令(根据您的 JDK 进行修改):

"C:\Program Files\AdoptOpenJDK\jdk-14.0.1.7-openj9\bin\serialver.exe" -classpath target/serialization-1.0.jar demonstration.serialization.Example

我回来了:

demonstration.serialization.Example:    private static final long serialVersionUID = 8528929994176475972L;

这不是我指定的 123 的值。在我稍微复杂一点的例子中,ObjectOutputStreams 和 ObjectInputStreams 确认我指定的值被忽略了。

【问题讨论】:

好吧。你的观察似乎是错误的。请给minimal reproducible example! @Seelenvirtuose 即使对于一个非常小的示例项目,观察结果似乎也是正确的。编辑成问题。 【参考方案1】:

发现问题。 Longlong不一样;确保在指定 serialVersionUID 时它与确切的形式匹配:

private static final long serialVersionUID = [value]L;

【讨论】:

以上是关于为啥Java忽略我的serialVersionUID?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 会忽略 .properties 文件的第一行?

为啥 Hibernate 会忽略 package-info.java?

为啥我的 IDocHostUIHandler 实现被忽略

为啥 .gitignore 不忽略我的文件?

为啥 Apache 忽略我的 VirtualHost 声明?

为啥我的覆盖保护函数 createChildren 被忽略?