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日

相关文章

  • Spring Data JPA分页复合查询原理解析

    Spring Data JPA分页复合查询原理解析 在使用 Spring Data JPA 的过程中,分页和复合查询是经常用到的功能。本文将详细讲解 Spring Data JPA 分页和复合查询的原理,同时给出两个示例进行演示。 分页原理 Spring Data JPA 的分页功能基于 Spring Framework 的 PagingAndSorting…

    Java 2023年5月20日
    00
  • Java编写多功能万年历程序的实例分享

    Java编写多功能万年历程序的实例分享 本攻略将介绍使用Java编写多功能万年历程序的完整过程。 1. 概述 本程序的功能包括: 显示公历日期、星期、农历日期、节气、节日等信息 支持查看指定日期的信息 支持查询指定日期范围内的某个节日的日期 支持查询指定日期范围内的某个节气的日期 支持循环显示节日或节气日期 2. 准备工作 为了编写这个程序,您需要掌握Jav…

    Java 2023年5月20日
    00
  • 在Java的Struts框架中ONGL表达式的基础使用入门

    对于在Java的Struts框架中ONGl表达式的基础使用入门,我将提供以下攻略: 一、什么是Struts框架 Struts框架是一个基于模型-视图-控制器(MVC)的web应用程序框架。它由Apache软件基金会开发,并且拥有活跃的社区支持和用户。它允许开发人员分离业务逻辑和用户界面,从而使开发人员能够更专注于他们的核心业务。 二、什么是OGNL表达式 O…

    Java 2023年5月20日
    00
  • JSP+ MySQL中文乱码问题post提交乱码解决方案

    JSP + MySQL 中文乱码问题主要发生在使用post方式提交数据时,提交的中文字符在数据库中查询后会变成乱码。下面我将详细讲解如何解决此问题。 问题分析 JSP中表单提交后,浏览器会自动将中文字符转码为UTF-8编码,而JDBC默认使用ISO8859_1编码与数据库进行交互,因此,需要将数据先从UTF-8编码转换为ISO8859_1编码,再进行插入,这…

    Java 2023年5月20日
    00
  • Java DelayQueue实现任务延时示例讲解

    让我详细讲解一下“Java DelayQueue实现任务延时示例讲解”的完整攻略。 什么是DelayQueue DelayQueue 是一个基于优先级队列 PriorityQueue 实现的无界阻塞队列,用于放置在给定延迟时间后才能被消费的元素(任务)。DelayQueue 中的元素必须实现 java.util.concurrent.Delayed 接口,该…

    Java 2023年5月20日
    00
  • 谈谈Java中的守护线程与普通线程

    Java中的线程分为两种类型——守护线程(Daemon Thread)和普通线程(User Thread)。守护线程是一种特殊的线程,它在后台运行,主要用于Java虚拟机的一些特定操作,比如垃圾回收和内存管理等。普通线程指的是用户线程,它是我们常规开发使用的线程。 定义 在Java中通过Thread类的构造函数和setDaemon方法设置线程的daemon属…

    Java 2023年5月19日
    00
  • Java实现可视化走迷宫小游戏的示例代码

    下面就来详细讲解如何使用Java实现可视化走迷宫小游戏。在本攻略中,我们将使用JavaFX框架来实现游戏界面及交互。 1. 环境准备 在开始之前,我们需要确保本地环境已正确配置。具体来说,我们需要: 安装最新版的JDK,以便编译和运行Java程序; 安装JavaFX SDK,以便使用JavaFX框架; 配置Eclipse或其他Java开发工具,以便我们能够方…

    Java 2023年5月24日
    00
  • java10下编译lombok注解代码分享

    为了在Java 10环境下编译Lombok注解代码,我们需要遵循以下步骤: 1.安装Lombok 可以通过Maven或Gradle依赖来安装Lombok。我们在Maven项目中添加以下依赖: <dependency> <groupId>org.projectlombok</groupId> <artifactId&g…

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