首页 > 编程语言 >Java基础知识回顾5-序列化和反序列化

Java基础知识回顾5-序列化和反序列化

时间:2023-11-19 23:01:46浏览次数:35  
标签:基础知识 Java name public 序列化 id String

一、概念

Java序列化是指把Java对象转换为字节序列的过程。

Java反序列化是指把字节序列恢复为Java对象的过程。

序列化作用:

在传递和保存对象时,保存对象的完整性和可传递性,对象转换为字节流,可以站网络上传输或者保存在本地文件中。

反序列化作用:

根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

缺点:

无法跨语言是Java序列化最致命的问题。

对于跨进程的服务调用,服务提供者可能是Java之外的其它语言,当我们需要和其它语言交互时,Java序列化就难以胜任。

二、序列化和反序列化注意事项

1.Java序列化的方式

实现 Serializable 接口:可以自定义 writeObject、readObject、writeReplace、readResolve 方法,会通过反射调用。

实现 Externalizable 接口:需要实现 writeExternal 和 readExternal 方法。

2.序列化ID问题

虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。

3.静态字段不会序列化

序列化时不保存静态变量,这是因为序列化保存的是对象的状态,静态变量属于类的状态,因此序列化并不保存静态变量。

4.transient

如果你不想让对象中的某个成员被序列化可以在定义它的时候加上 transient 关键字进行修饰,这样,在对象被序列化时其就不会被序列化。

transient 修饰过的成员反序列化后将赋予默认值,即 0 或 null。

5.当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化

三、测试

package day01;

import java.io.Serializable;

/**
 * @author qx
 * @date 2023/10/19
 * @des 用户实体类
 */
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    // 静态变量不参与序列化
    public static Integer age = 20;
    // transient修饰的变量不参与序列化
    private transient String password;


    public User() {
    }

    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public static Integer getAge() {
        return age;
    }


    @Override
    public String toString() {
        return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}';
    }
}
package day01;

import java.io.*;

/**
 * @author qx
 * @date 2023/10/19
 * @des 序列化和反序列化
 */
public class SerializableTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        serializeUser();
        deSerializeUser();
    }

    /**
     * 反序列化
     *
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private static void deSerializeUser() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:" + File.separator + "data.txt"));
        User user = (User) ois.readObject();
        System.out.println(user);
        ois.close();
    }

    /**
     * 序列化
     *
     * @throws IOException
     */
    private static void serializeUser() throws IOException {
        User user = new User();
        user.setId(1L);
        user.setName("qx");
        user.setPassword("123");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:" + File.separator + "data.txt"));
        oos.writeObject(user);
        oos.close();
    }
}

控制台输出:

User{id=1, name='qx', password='null'}


标签:基础知识,Java,name,public,序列化,id,String
From: https://blog.51cto.com/u_13312531/8476018

相关文章

  • Java之抽象类的详解
    1.1概述1.1.1抽象类引入父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了(因为子类对象会调用自己重写的方法)。换句话说,父类可能知道子类应该有哪个功能,但是功能具体怎么实现父类是不清楚的(由......
  • java反序列化----CC7利用链学习笔记(Hashtable)
    目录java反序列化----CC7利用链学习笔记(Hashtable)环境搭建利用链java反序列化----CC7利用链学习笔记(Hashtable)环境搭建jdk8u71<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId>......
  • JAVA注解(韩顺平)
    第一部分:三个基本的注解Override用于检查方法重写的语法是否正确Override的结构(ctrl+b可以查看该注解的结构)Deprecatedpackagecom.annotation;//测试@Deprecataed注解publicclassDeprecated{publicstaticvoidmain(String[]args){Dd=ne......
  • java.io.IOException: Problem reading font data.
    字体库问题:运行命令fc-list 在运行yuminstallfontconfig后并没有解决这个问题那就是是临时文件的问题在查看Tomcat下bin/catalina.sh文件找到java的JVM临时目录java.io.tmpdir的配置是CATALINA_TMPDIR=“$CATALINA_BASE”/tempCATALINA_BASE指向的是Tomcat安装目录,由于是迁......
  • Java实现压缩文件浅谈
    背景:在Java中,可以使用java.util.zip包提供的类来进行文件的压缩和解压缩操作。主要涉及的类有ZipOutputStream、ZipEntry、ZipInputStream和InflaterInputStream。压缩文件的步骤和原理:创建一个FileOutputStream对象,用于将压缩后的数据写入到文件中。创建一个BufferedOutp......
  • java 权限修饰符和代码块
    ......
  • java-blog2
    一、前言1、知识点:主要是java中类与类之间的关系和类图的构建以及对数据的处理2、题量:题量不大,简单的作业题量多点,难点的作业题量少点总体来说还行3、难度:难度在不断的变大,每一题所花的时间也在不断的增加二、设计与分析:第四次大作业:设计点菜计价程序,根据输入的信息,计算并输......
  • java 包和final
    packagenet.elaina;publicclassTest{publicstaticvoidmain(String[]args){/*final修饰方法:表明该方法是最终方法,不能被重写final修饰类:表明该类是最终类,不能被继承final修饰变量:叫做常量,只能被赋值......
  • Java 多线程事务控制
    Java多线程怎么做事务控制公司业务中遇到一个需求,需要同时修改最多约5万条数据,而且还不支持批量或异步修改操作。于是只能写个for循环操作,但操作耗时太长,只能一步一步寻找其他解决方案。具体操作如下:一、循环操作的代码先写一个最简单的for循环代码,看看耗时情况怎么样。/......
  • 【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解
    本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计RESTAPI,通过使用Django来实现一个RESTAPI为例,明确后端开发RESTAPI要做的最核心工作,然后介绍DjangoRESTframework能帮助我们简化开发RESTAPI的工作。全套DRF笔记直接地址:请移步这里共5章,24子模块,总计1......