Java对象Serializable接口实现详解

下面是Java对象Serializable接口实现的详细攻略:

什么是Serializable接口?

Serializable是Java中的一个接口,用于将Java对象转换成字节序列以便于在网络上传输或者进行持久化存储。通过实现Serializable接口,Java对象可以被序列化为一个字节数组,保存到内存或输出到磁盘或网络。实现Serializable接口的类必须满足如下条件:

  1. 该类必须实现Serializable接口,没有实现Serializable接口的类不能被序列化.
  2. 该类所有属性也必须是可序列化的,否则必须标记为transient。

如何实现Serializable接口?

要实现Serializable接口,只需要在类声明中加入“implements Serializable”关键字即可。

public class User implements java.io.Serializable {
    private int id;
    private String name;
    // getter和setter方法
}

如上面的例子所示,User类实现了Serializable接口。

序列化对象

在Java中,有两个主要的序列化类,ObjectInputStream和ObjectOutputStream。接下来我们通过使用这两个类,来序列化和反序列化一个Java对象。

首先,我们需要将一个Java对象转换成一个字节数组,就像这样:

public byte[] serialize(User user) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(user);
    return baos.toByteArray();
}

上述代码中,我们创建了一个ByteArrayOutputStream对象以及一个ObjectOutputStream对象,然后调用writeObject()方法将一个User对象序列化成一个字节数组。最后,我们返回这个字节数组。

反序列化对象

完成序列化后,我们需要将这个字节数组还原为一个Java对象。这里是反序列化的代码示例:

public User deserialize(byte[] data) throws IOException, ClassNotFoundException {
    ByteArrayInputStream bais = new ByteArrayInputStream(data);
    ObjectInputStream ois = new ObjectInputStream(bais);
    return (User)ois.readObject();
}

上述代码中,我们通过ByteArrayInputStream和ObjectInputStream的组合,从字节数组中读取数据。然后我们将其转换为User对象并返回。

示例1

我们拿User类来举一个示例,代码如下:

package com.example.serializable;

import java.io.*;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;

    public User() {}

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

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

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User(1, "tom");
        System.out.println("序列化前:" + user.toString());

        // 序列化对象
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(user);

        // 反序列化对象
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        User user1 = (User) ois.readObject();

        System.out.println("序列化后:" + user1.toString());
    }
}

执行程序后,输出结果如下:

序列化前:User{id=1, name='tom'}
序列化后:User{id=1, name='tom'}

示例2

我们拿Student类举一个复杂点的示例,代码如下:

package com.example.serializable;

import java.io.*;

public class Student implements Serializable {
    private static final long serialVersionUID = -5498035777624124029L;
    private int id;
    private String name;
    private transient int age;

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Student student = new Student(1, "tom", 18);
        System.out.println("序列化前:" + student.toString());

        // 序列化对象
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(student);

        // 反序列化对象
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        Student student1 = (Student) ois.readObject();

        System.out.println("序列化后:" + student1.toString());
    }
}

在上面的示例中,我们定义了一个Student类,并在这个类中使用了transient关键字将age属性标记为不可序列化。执行程序后,输出结果如下:

序列化前:Student{id=1, name='tom', age=18}
序列化后:Student{id=1, name='tom', age=0}

从输出结果中可以看出,age属性的值在反序列化后变成了0。

以上就是Java对象Serializable接口实现的详细攻略,感谢阅读。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象Serializable接口实现详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 将Excel中数据导入到Access数据库中的方法

    将Excel中数据导入到Access数据库中的方法可以通过以下步骤实现: 第一步:准备工作 在开始之前,需要完成以下准备工作: 熟悉Excel软件和Access数据库软件的基本操作; 确定好数据源Excel文件和目标数据库Access文件的路径; 确定好要将Excel中的哪些数据导入到Access中。 第二步:准备Access数据库 在开始导入数据之前,需要…

    Java 2023年5月19日
    00
  • Java 使用Calendar计算时间的示例代码

    下面是关于Java使用Calendar计算时间的完整攻略。 简介 Java提供了大量的时间和日期处理类和方法,其中Calendar类是处理时间和日期计算非常常用的类之一。这个类被广泛地应用于Java应用程序中,特别是在必须处理复杂日期和时间计算情况下。 获取Calendar实例 在使用Calendar类前,需要先获取一个Calendar实例。通常情况下,可以…

    Java 2023年5月20日
    00
  • 对Java字符串与整形、浮点类型之间的相互转换方法总结

    下面是“对Java字符串与整形、浮点类型之间的相互转换方法总结”的攻略。 1. Java字符串转整型 Java字符串可以通过Integer类的静态方法parseInt()实现转换成整型数据。具体语法如下: String s = "123"; int i = Integer.parseInt(s); // 这里的i值为123 同样的,如果字…

    Java 2023年5月27日
    00
  • Java中Timer的用法详解

    Java中Timer的用法详解 什么是Timer? Timer是Java中的一个定时器工具类,可以用于在指定的时间间隔内重复执行某个任务,或执行单次任务。 Timer的基本用法 创建一个Timer对象 Timer timer = new Timer(); 定义需要重复执行的任务 TimerTask task = new TimerTask() { @Over…

    Java 2023年5月20日
    00
  • IDEA中Maven依赖包下载不了的问题解决方案汇总

    针对“IDEA中Maven依赖包下载不了的问题解决方案汇总”,下面是详细的解决方案攻略: 1.检查Maven配置 在IDEA中,我们首先需要检查Maven的配置是否正确。具体步骤如下: 打开IDEA,点击菜单栏的File->Settings->Build, Execution, Deployment->Build Tools->Mav…

    Java 2023年6月2日
    00
  • java中List集合及其实现类的方法详解

    Java中List集合及其实现类的方法详解 什么是List集合? List集合是Java中最常用的集合之一,它可以存储有序、可重复的数据。 List实现类 Java中常见的List实现类有3种: ArrayList LinkedList Vector 其中,Vector常用于多线程并发访问的场景中,由于其性能较慢,因此本文不再赘述。下面详细讲解ArrayLi…

    Java 2023年5月18日
    00
  • JAVA读取属性文件的几种方法总结

    JAVA读取属性文件的几种方法总结 在JAVA中,属性文件是非常重要的。属性文件通常用来保存一些固定的配置信息,例如数据库的配置信息、系统的路径等。在开发中,我们读取属性文件的操作也是非常频繁的。本文将会详细介绍JAVA读取属性文件的几种方法,帮助大家更好的使用JAVA读取属性文件。 一、使用Properties类 Properties类是JAVA中常用的读…

    Java 2023年5月20日
    00
  • Java SpringMVC 集成静态资源的方式你了解吗

    Java SpringMVC 集成静态资源的方式 在Java SpringMVC中,我们可以使用多种方式来集成静态资源,如CSS、JavaScript、图片等。本文将详细讲解Java SpringMVC集成静态资源的方式。 方式一:使用标签 标签是SpringMVC提供的一种集成静态资源的方式。下面是一个使用标签的示例代码: <mvc:resource…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部