java 序列化与反序列化的作用以及简单示例
序列化与反序列化的介绍:
- 概念:
序列化:把对象转换为字节序列的过程称为对象的序列化.
反序列化:把字节序列恢复为对象的过程称为对象的反序列化. - 白话:
序列化是指把一个Java对象变成二进制内容,本质上就是一个byte[]数组。 - 为什么要把Java对象序列化呢?
因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把Java对象存储到文件或者通过网络传输出去了。
有序列化,就有反序列化,即把一个二进制内容(也就是byte[]数组)变回Java对象。有了反序列化,保存到文件中的byte[]数组又可以“变回”Java对象,或者从网络上读取byte[]并把它“变回”Java对象。 - 作用:
把对象转成JSON、xml 的时候,往往这些接口、方法 都实现了序列化,因为网络传输也是一个二进制的过程,需要进行转换。
所以只要我们对内存中的对象进行持久化或网络传输, 这个时候都需要序列化和反序列化.
序列化、反序列化的示例
- 序列化、反序列化的逻辑
package com.serializable.one.util;
import com.serializable.one.dto.UserDTO;
import java.io.*;
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化用户对象
serializeUser();
//反序列化用户对象
deserializeUser();
}
/**
* 序列化 将对象数据存入文件
* @throws IOException
*/
private static void serializeUser() throws IOException {
FileOutputStream fos = new FileOutputStream("/Users/shiziyang/Desktop/User.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
UserDTO userDTO1 = new UserDTO("zhansan", "admin", 30);
oos.writeObject(userDTO1);
oos.flush();
System.out.println("UserDTO 对象序列化成功!");
oos.close();
}
/**
* 反序列化 读取文件中的对象数据
* @throws IOException
* @throws ClassNotFoundException
*/
private static void deserializeUser() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("/Users/shiziyang/Desktop/User.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
UserDTO userDTO2 = (UserDTO) ois.readObject();
System.out.println(userDTO2.getUserName() + " " +
userDTO2.getPassword() + " " + userDTO2.getYear());
System.out.println("UserDTO 对象反序列化成功!");
}
}
- 对象实体
package com.serializable.one.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class UserDTO implements Serializable {
private static final long serialVersionUID = 3608451818006447638L;
private String userName;
private String password;
private Integer year;
}
- 执行完后,生成的是二进制文件:
其实这个例子就是序列化和反序列化的一个小过程,JVM通过序列化把对象写到文件,再通过反序列化从文件中读取数据,把数据转成一个对象。 - 看到控制台输出也是正常的:
实现 Serializable 接口还要指定serialVersionUID的值的作用:
- 在 Java 中实现了 Serializable 接口后, JVM 会在底层帮我们实现序列化和反序列化,如果你实现该接口,你也可以自己自定义一个,就是有点复杂,这里不展开。
如果不显示指定 serialVersionUID, JVM 在序列化时会根据属性自动生成一个 serialVersionUID, 然后与属性一起序列化,再进行持久化或网络传输。
在反序列化时,JVM 会再根据属性自动生成一个新版 serialVersionUID,然后将这个新版 serialVersionUID 与序列化时生成的旧版 serialVersionUID 进行比较,如果相同则反序列化成功, 否则报错.
如果显示指定了 serialVersionUID, JVM 在序列化和反序列化时仍然都会生成一个 serialVersionUID, 但值为我们显示指定的值,这样在反序列化时新旧版本的 serialVersionUID 就一致了. - 接上面的例子,我不生成serialVersionUID,反序列化也是没有问题的,但如果我指定了不一致的serialVersionUID ,或者加了新的属性:
package com.serializable.one.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class UserDTO implements Serializable {
// private static final long serialVersionUID = 3608451818006447638L;
private String userName;
private String password;
private Integer year;
private Integer age;
}
- 再调用deserializeStudent() 反序列化方法时就会报错:
/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=52869:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/legacy8ujsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/openjsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Users/shiziyang/IdeaProjects/StudyDemo/SerializableDemo/SerializableDemoOne/target/classes:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-web/2.3.2.RELEASE/spring-boot-starter-web-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter/2.3.2.RELEASE/spring-boot-starter-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot/2.3.2.RELEASE/spring-boot-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-autoconfigure/2.3.2.RELEASE/spring-boot-autoconfigure-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-logging/2.3.2.RELEASE/spring-boot-starter-logging-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-core/5.2.8.RELEASE/spring-core-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-jcl/5.2.8.RELEASE/spring-jcl-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-json/2.3.2.RELEASE/spring-boot-starter-json-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/core/jackson-databind/2.11.1/jackson-databind-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/core/jackson-annotations/2.11.1/jackson-annotations-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/core/jackson-core/2.11.1/jackson-core-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.1/jackson-datatype-jdk8-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.1/jackson-datatype-jsr310-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.1/jackson-module-parameter-names-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-tomcat/2.3.2.RELEASE/spring-boot-starter-tomcat-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/tomcat/embed/tomcat-embed-core/9.0.37/tomcat-embed-core-9.0.37.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.37/tomcat-embed-websocket-9.0.37.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-web/5.2.8.RELEASE/spring-web-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-beans/5.2.8.RELEASE/spring-beans-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-webmvc/5.2.8.RELEASE/spring-webmvc-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-aop/5.2.8.RELEASE/spring-aop-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-context/5.2.8.RELEASE/spring-context-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-expression/5.2.8.RELEASE/spring-expression-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/projectlombok/lombok/1.18.12/lombok-1.18.12.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar com.serializable.one.util.SerializableTest
Exception in thread "main" java.io.InvalidClassException: com.serializable.one.dto.UserDTO; local class incompatible: stream classdesc serialVersionUID = -4485713041308221316, local class serialVersionUID = -1411753975542132840
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2002)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1849)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2159)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1666)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:502)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:460)
at com.serializable.one.util.SerializableTest.deserializeUser(SerializableTest.java:38)
at com.serializable.one.util.SerializableTest.main(SerializableTest.java:13)
Process finished with exit code 1
- 还有一种情况就是,假如你不实现Serializable接口,在反序列化的时候也是会报错的:
package com.serializable.one.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class UserDTO {//implements Serializable {
// private static final long serialVersionUID = 3608451818006447638L;
private String userName;
private String password;
private Integer year;
}
- 报错NotSerializableException:
/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:52949,suspend=y,server=n -javaagent:/Users/shiziyang/Library/Caches/JetBrains/IdeaIC2022.1/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/legacy8ujsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/openjsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Users/shiziyang/IdeaProjects/StudyDemo/SerializableDemo/SerializableDemoOne/target/classes:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-web/2.3.2.RELEASE/spring-boot-starter-web-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter/2.3.2.RELEASE/spring-boot-starter-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot/2.3.2.RELEASE/spring-boot-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-autoconfigure/2.3.2.RELEASE/spring-boot-autoconfigure-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-logging/2.3.2.RELEASE/spring-boot-starter-logging-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-core/5.2.8.RELEASE/spring-core-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-jcl/5.2.8.RELEASE/spring-jcl-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-json/2.3.2.RELEASE/spring-boot-starter-json-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/core/jackson-databind/2.11.1/jackson-databind-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/core/jackson-annotations/2.11.1/jackson-annotations-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/core/jackson-core/2.11.1/jackson-core-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.1/jackson-datatype-jdk8-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.1/jackson-datatype-jsr310-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.1/jackson-module-parameter-names-2.11.1.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/boot/spring-boot-starter-tomcat/2.3.2.RELEASE/spring-boot-starter-tomcat-2.3.2.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/tomcat/embed/tomcat-embed-core/9.0.37/tomcat-embed-core-9.0.37.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.37/tomcat-embed-websocket-9.0.37.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-web/5.2.8.RELEASE/spring-web-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-beans/5.2.8.RELEASE/spring-beans-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-webmvc/5.2.8.RELEASE/spring-webmvc-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-aop/5.2.8.RELEASE/spring-aop-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-context/5.2.8.RELEASE/spring-context-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/springframework/spring-expression/5.2.8.RELEASE/spring-expression-5.2.8.RELEASE.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/projectlombok/lombok/1.18.12/lombok-1.18.12.jar:/Users/shiziyang/javaProgram/maven/apache-maven-3.8.3/maven-local/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar com.serializable.one.util.SerializableTest
Connected to the target VM, address: '127.0.0.1:52949', transport: 'socket'
Exception in thread "main" java.io.NotSerializableException: com.serializable.one.dto.UserDTO
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.serializable.one.util.SerializableTest.serializeUser(SerializableTest.java:24)
at com.serializable.one.util.SerializableTest.main(SerializableTest.java:11)
Disconnected from the target VM, address: '127.0.0.1:52949', transport: 'socket'
Process finished with exit code 1
通过这个例子你就大概知道,反序列化是和类和属性有关,就像秘钥和公钥一样,只有正确的serialVersionUID和类匹配,才能反序列化。
- 序列化的其他特性
1、static 属性不会被序列化
2、transient 修饰的属性,也不会被序列化
结论
- 网络传输、对象转换一定要使用序列化
- 实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值
- static 、transient 修饰的属性不会反序列化。