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/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,