关于Java序列化你应该知道的一切

什么是序列化

我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。

Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。

怎么序列化一个对象?

要序列化一个对象,这个对象所在类就必须实现Java序列化的接口:java.io.Serializable。

1、类添加序列化接口
import java.io.Serializable;

public class User implements Serializable{

    private static final long serialVersionUID = -8475669200846811112L;

    private String username;
    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

}
2、序列化/反序列化

可以借助commons-lang3工具包里面的类实现对象的序列化及反序列化,你没有必要自己写。

import org.apache.commons.lang3.SerializationUtils;

public class Test {

    public static void main(String[] args) {
        User user = new User();
        user.setUsername("Java");
        user.setAddress("China");
        byte[] bytes = SerializationUtils.serialize(user);

        User u = SerializationUtils.deserialize(bytes);
        System.out.println(u);

    }

}

输出:

User{username='Java', address='China'}

上例通过序列化对象字节到内存然后反序列化,当然里面也提供了序列化磁盘然后再反序列化的方法,原理都是一样的,只是目标地不一样。

序列化注意事项

  • 序列化对象必须实现序列化接口。

  • 序列化对象里面的属性是对象的话也要实现序列化接口。

  • 类的对象序列化后,类的序列化ID不能轻易修改,不然反序列化会失败。

  • 类的对象序列化后,类的属性有增加或者删除不会影响序列化,只是值会丢失。

  • 如果父类序列化了,子类会继承父类的序列化,子类无需添加序列化接口。

  • 如果父类没有序列化,子类序列化了,子类中的属性能正常序列化,但父类的属性会丢失,不能序列化。

  • 用Java序列化的二进制字节数据只能由Java反序列化,不能被其他语言反序列化。如果要进行前后端或者不同语言之间的交互一般需要将对象转变成Json/Xml通用格式的数据,再恢复原来的对象。

推荐阅读

干货:2TB架构师四阶段视频教程

面经:史上最全Java多线程面试题及答案

面经:史上最全阿里高级Java面试题

面经:史上最全Spring面试题

教程:最全Spring Boot全套视频教程

书籍:进阶Java架构师必看的15本书

工具:推荐一款在线创作流程图、思维导图软件

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是实现代码: 首先,我们需要定义一个 `Student` 类,该类需要实现 `Serializable` 接口,以便能够被序列化和反序列化。 ```java import java.io.Serializable; public class Student implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private int age; public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public String getName() { return name; } public int getAge() { return age; } } ``` 接下来,我们需要创建一个包含多个 `Student` 对象的集合,这里我们使用 `ArrayList`。 ```java import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class SerializeStudent { public static void main(String[] args) { ArrayList<Student> students = new ArrayList<Student>(); students.add(new Student(1, "Tom", 18)); students.add(new Student(2, "Jerry", 19)); students.add(new Student(3, "Mike", 20)); students.add(new Student(4, "John", 21)); students.add(new Student(5, "Lucy", 22)); } } ``` 最后,我们使用 `ObjectOutputStream` 将集合对象序列化到文件中。 ```java import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class SerializeStudent { public static void main(String[] args) { ArrayList<Student> students = new ArrayList<Student>(); students.add(new Student(1, "Tom", 18)); students.add(new Student(2, "Jerry", 19)); students.add(new Student(3, "Mike", 20)); students.add(new Student(4, "John", 21)); students.add(new Student(5, "Lucy", 22)); try { FileOutputStream fileOut = new FileOutputStream("students.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(students); out.close(); fileOut.close(); System.out.println("Serialized data is saved in students.ser"); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } } } ``` 以上代码中,我们将 `ArrayList` 对象 `students` 序列化到文件 `students.ser` 中。如果一切顺利,程序会输出 "Serialized data is saved in students.ser"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java技术栈

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值