java 序列化与反序列化的作用以及简单示例

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 修饰的属性不会反序列化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酸菜鱼(szy)

如果给您提供帮助的话可以打赏哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值