Java实现几种序列化方式总结

Java实现几种序列化方式总结

什么是序列化

序列化是将对象转换为字节流的过程,目的是为了在网络上传输或者将对象转存储到硬盘等介质中。

Java中的序列化

在Java中,实现序列化需要满足两个条件:一是实现Serializable接口,二是定义一个静态的序列化ID,例如:

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 1234567890L;
    private String name;
    private int age;
    // 省略getter和setter
}

Java中几种序列化方式

Java自带的序列化方式

Java自带的序列化方式是将对象转换为二进制格式进行传输。其优点是使用简单,只需实现Serializable接口即可,但是它的缺点也比较明显:

  • 序列化后的数据占用的空间比较大。
  • 序列化后的数据对于人类阅读不友好,也不利于调试。

下面是示例代码:

import java.io.*;

public class JavaSerializerUtil {
    public static <T> byte[] serialize(T object) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
        byte[] bytes = baos.toByteArray();
        baos.close();
        oos.close();
        return bytes;
    }

    public static <T> T deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(bais);
        T object = (T) ois.readObject();
        bais.close();
        ois.close();
        return object;
    }
}

JSON序列化方式

JSON序列化方式是将对象转换为JSON格式进行传输。其优点是数据占用的空间比较小,对于人类阅读友好,也比较利于调试。但是它的缺点是需要引入相关的库进行序列化和反序列化。

下面是示例代码:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class JsonSerializerUtil {
    private static final ObjectMapper objectMapper = new ObjectMapper();

    public static <T> byte[] serialize(T object) throws IOException  {
        return objectMapper.writeValueAsBytes(object);
    }

    public static <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException {
        return objectMapper.readValue(bytes, clazz);
    }
}

CSV序列化方式

CSV序列化方式是将对象转换为CSV格式进行传输。其优点是数据占用的空间很小,可以使用Excel等软件进行查看和分析。但是它的缺点是对于复杂类型的序列化和反序列化比较困难。

下面是示例代码:

import com.opencsv.CSVWriter;
import java.io.IOException;
import java.io.StringWriter;

public class CsvSerializerUtil {
    public static String serialize(Person person) throws IOException {
        StringWriter out = new StringWriter();
        CSVWriter writer = new CSVWriter(out);
        String[] line = {person.getName(), String.valueOf(person.getAge())};
        writer.writeNext(line);
        writer.close();
        return out.toString();
    }

    public static Person deserialize(String csv) throws IOException {
        String[] line = csv.split(",");
        Person person = new Person();
        person.setName(line[0]);
        person.setAge(Integer.parseInt(line[1]));
        return person;
    }
}

总结

以上就是Java中几种常用的序列化方式,在选择序列化方式的时候需要根据业务需求进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现几种序列化方式总结 - Python技术站

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

相关文章

  • Java中request对象常用方法汇总

    关于Java中request对象常用方法汇总的攻略,我将从以下几个方面展开: request对象简介 读取请求参数 读取请求头信息 读取请求体内容 设置请求属性 获取请求属性 1. request对象简介 在Java中,request对象是一个接口,它提供了一种方式来访问HTTP请求的信息。当客户端发送一个HTTP请求到服务器端后,服务器端会创建一个requ…

    Java 2023年5月26日
    00
  • Sprint Boot @Async使用方法详解

    Spring Boot的@Async注解 在Spring Boot中,@Async注解用于标记异步方法。使用@Async注解可以将方法标记为异步方法,并在调用这些方法时使用线程池来执行它们。本文将详细介绍@Async注解的作用和使用方法,并提供两个示例说明。 @Async注解作用 在Spring Boot中,@Async注解的作用是标记方法为异步方法。使用@…

    Java 2023年5月5日
    00
  • JAVA得到数组中最大值和最小值的简单实例

    当我们需要在一个数组中寻找最大值或最小值时,我们可以采用循环遍历数组的方式,比较每一个元素和当前最大或最小值的大小,然后更新最大或最小值。以下是用JAVA实现这个过程的简单实例。 准备工作 首先,我们需要准备一个需要查找的数组。我们可以在代码中手动定义一个数组,例如: int[] myArray = {5, 12, 8, 19, 3, 16}; 或者,也可以…

    Java 2023年5月26日
    00
  • SpringBoot应用启动流程源码解析

    SpringBoot应用启动流程源码解析 SpringBoot是一款基于Spring框架的快速开发脚手架,具有很高的灵活性和可扩展性。在深入学习SpringBoot应用时,我们需要了解SpringBoot的启动流程。本文将进行“SpringBoot应用启动流程源码解析”的详细讲解,包括SpringBoot应用启动的主要流程、常用的启动方式和相关的代码分析。 …

    Java 2023年5月15日
    00
  • JavaWeb中的路径问题解读

    JavaWeb中的路径问题解读 在JavaWeb开发中,路径问题一直是困扰初学者的难点之一,本文将深入剖析JavaWeb中的路径问题,让读者对JavaWeb中的路径有更全面的理解。 1. 路径的种类 在JavaWeb中,常见的路径种类包括:绝对路径、相对路径、虚拟路径和物理路径。接下来分别进行讲解。 1.1 绝对路径 绝对路径是指从硬盘根目录开始的完整路径,…

    Java 2023年6月16日
    00
  • 什么是线程池调度算法?

    以下是关于线程池调度算法的完整使用攻略: 什么是线程池调度算法? 线程池调度算法是指在线程编程中,使用线程池来管理线程的执行,从而提高程序的性能和效率的一种算法。线程池调度算法可以根据任务的类型、优先级、执行时间等因素,来动态地调整线程池中线程的和执行顺序,从而最化地利用系统资源,提高程序的响应速度和吞吐量。 线程池调度算法的实现 线程池调度算法的实现需要考…

    Java 2023年5月12日
    00
  • 详解Spring boot/Spring 统一错误处理方案的使用

    详解Springboot/Spring统一错误处理方案的使用 在SpringBoot/Spring应用程序中,错误处理是一个非常重要的方面。在本文中,我们将介绍如何使用SpringBoot/Spring的统一错误处理方案来处理应用程序中的错误。 步骤一:添加依赖 我们需要在pom.xml文件中添加Spring Boot Starter Web依赖。以下是一个…

    Java 2023年5月15日
    00
  • 怎么运行用记事本写的java程序

    当我们使用记事本来编写Java程序时,需要注意一些细节,例如设置环境变量、保存文件格式、编译运行指令等等。下面是详细讲解如何在Windows操作系统中使用记事本运行Java程序的攻略: 环境变量配置 为了让操作系统知道我们的Java程序在哪里,我们需要设置Java环境变量。可以按照如下步骤进行设置: 在桌面上用鼠标右键点击“此电脑”图标,然后选择“属性”选项…

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