Java 中的 SerialVersionUID
本文介绍如何在 Java 中使用 SerialVersionUID。
Java 中的 SerialVersionUID
SerialVersionUID 用于序列化。 序列化是将对象转换为字节流以存储数据并将其发送到某个地方的过程,反序列化是相反的过程。
在序列化过程中,Java运行时会给每个Serialized类关联一个版本号; 该数字称为 SerialVersionUID。
SerialVersionUID 用于验证序列化数据的发送者和接收者是否已加载该数据的类并且在序列化方面兼容。
例如,如果接收方为对象加载了一个类,其 SerialVersionUID 与相应发送方的类不同,它将抛出 InvalidClassException。
我们可以为 Serialized 类声明我们自己的 SerialVersionUID。 SerialVersionUID 将被声明为 Static Final 和 Long 类型。
查看语法:
private static final long serialVersionUID = 10L;
让我们尝试一个使用 SerialVersionUID 实现序列化和反序列化的示例。 参见示例:
package jiyik;
import java.io.*;
import java.util.logging.Logger;
public class Example implements java.io.Serializable {
//The Default serial version uid
private static final long serialVersionUID = 4L;
//random name
private static final String File_Name = "ExampleClassBytes.ser";
private static final Logger logger_File = Logger.getLogger("");
//Few data fields Which will be able to serialize
private static String Static_Variable;
private int Integer_Variable;
//Few data fields Which will not be able to serialize
transient private String Transient_Variable = "this is a transient instance field";
private Thread Thread_Class;
private static Object readIn() throws IOException, ClassNotFoundException {
ObjectInputStream Object_Input_Stream = new ObjectInputStream(new FileInputStream(new File(File_Name)));
return Object_Input_Stream.readObject();
}
private static void writeOut(java.io.Serializable object) throws IOException {
ObjectOutputStream Object_Output_Stream = new ObjectOutputStream(new FileOutputStream(new File(File_Name)));
Object_Output_Stream.writeObject(object);
Object_Output_Stream.close();
}
@Override public String toString() {
return "Example Class:- final static fileName is: " + File_Name + ", final static logger is: " + logger_File
+ ", the non-final static staticVariable is: " + Static_Variable + ", the instance intVariable is: " + Integer_Variable
+ ", the transient instance Variable is: " + Transient_Variable + ", the non-serializable instance field threadClass is : " + Thread_Class;
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
//Serialization
Example Demo = new Example();
Demo.Integer_Variable = 1;
Static_Variable = "this is the static variable";
writeOut(Demo);
System.out.println("Example Class to be saved: " + Demo);
//De-serialization
System.out.println("Example Class deserialized: " + readIn());
}
}
如果 Serialized 类未显式声明 SerialVersionUID,则运行时将根据方面计算该类的默认 SerialVersionUID。 现在让我们看看上面代码的输出。
Example Class to be saved: Example Class:- final static fileName is: ExampleClassBytes.ser, final static logger is: java.util.logging.LogManager$RootLogger@27973e9b, the non-final static staticVariable is: this is the static variable, the instance intVariable is: 1, the transient instance Variable is: this is a transient instance field, the non-serializable instance field threadClass is : null
Example Class deserialized: Example Class:- final static fileName is: ExampleClassBytes.ser, final static logger is: java.util.logging.LogManager$RootLogger@27973e9b, the non-final static staticVariable is: this is the static variable, the instance intVariable is: 1, the transient instance Variable is: null, the non-serializable instance field threadClass is : null
基于上述场景,关于 SerialVersionUID 的一些要点:
- 序列化期间静态和瞬态字段会被忽略,反序列化后瞬态和非静态最终字段将变为空。
- 对于序列化,我们需要处理 IOException,对于反序列化,我们需要处理 IOException 和 ClassNotFoundException。 这意味着反序列化的类类型应该位于类路径中。
- 方法 ObjectInputStream.readObject() 和 ObjectOutputStream.writeObject(object) 用于序列化和反序列化操作。
- 序列化和反序列化可用于克隆和复制对象,这比常规克隆操作相对慢。
- 未初始化、不可序列化和非瞬态实例是可以容忍的。
- 在修改实现java.io.Serialized的类时,我们必须小心,因为如果一个类不包含SerialVersionUID,那么编译器将生成SerialVersionUID。
- 计算 SerialVersionUID 不仅基于字段,还基于其他方面,如构造函数、实现子句等。这意味着我们应该显式声明 SerialVersionUID,这也将保持向后兼容性。
相关文章
在 Java 中计算数组的中位数
发布时间:2023/08/08 浏览次数:195 分类:Java
-
本文将举例说明如何计算中位数以及均值与中位数之间的差值。 此外,我们还将向您展示如何解决中位数问题陈述。然后,我们将运行一个Java程序,简而言之,它充分利用了Arrays.sort()、lengt
在 Java 中查找给定数字的因数
发布时间:2023/08/08 浏览次数:76 分类:Java
-
在本文中,我们将学习如何在 Java 中查找给定数字的不同因子或除数。在 Java 中查找给定数字的因数 一种简单的方法是遍历从 1 到 n 的所有数字,看看它们是否能正确整除 n(即余数为零)。
JNDI 及其在 Java 中的用途
发布时间:2023/08/08 浏览次数:180 分类:Java
-
本文将讨论 JNDI(Java 命名和目录接口)是什么、它的主要用途以及何时使用它。 还比较了Java中JNDI的优缺点。Java 中的 Java 命名和目录接口 (JNDI)
Java getActionCommand() 方法
发布时间:2023/08/08 浏览次数:161 分类:Java
-
本文介绍如何在 Java 中使用 getActionCommand() 方法。在 Java 中使用 getActionCommand() 方法 ActionListener 类中的 getActionCommand() 方法标识一个按钮。
Java中获取屏幕分辨率
发布时间:2023/08/07 浏览次数:139 分类:Java
-
本文将展示如何在 Java 中找到屏幕分辨率。 此外,我们将通过一些示例和解释来讨论该主题,以使该主题更容易。在 Java 中查找单屏幕窗口的屏幕分辨率
如何在 Java 代码中调用 Python 脚本
发布时间:2023/08/07 浏览次数:139 分类:Java
-
本文介绍了从 Java 代码调用 Python 脚本的三种不同方法。从 Java 代码调用 Python 脚本 有时,我们必须从Java代码中调用Python脚本来满足项目需求。
5 个最好的 Java 图像处理库
发布时间:2023/08/07 浏览次数:181 分类:Java
-
本文介绍了 Java 中五个最好的图像处理库。5 个最好的 Java 图像处理库 Java 中提供了相当多的图像处理库可以用于图像处理。 有些库是付费的,有些是开源的; 我们选择了 5 个可用于 Java 图像