为什么 Java 忽略了我的 serialVersionUID?
Why is Java Ignoring My serialVersionUID?
我有一个 class 定义了 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。在我稍微复杂一点的例子中,ObjectOuputStreams 和 ObjectInputStreams 确认我指定的值被忽略了。
找到问题了。 Long
与 long
不同;确保在指定 serialVersionUID 时它与确切的形式匹配:
private static final long serialVersionUID = [value]L;
我有一个 class 定义了 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。在我稍微复杂一点的例子中,ObjectOuputStreams 和 ObjectInputStreams 确认我指定的值被忽略了。
找到问题了。 Long
与 long
不同;确保在指定 serialVersionUID 时它与确切的形式匹配:
private static final long serialVersionUID = [value]L;