Java 关于序列化、Json和Gson详解

前言

本人为了提升本人的编程能力、java 编程思想,进行了一些框架项目的编程,遇到了一些关于序列化和反序列化的问题,并且对 Json 以及Gson 的理解和用法进行一个总结。

序列化

什么是序列化

序列化是一种将对象转换为字节流或文件的过程,以便于存储或网络传输。在 Java 中,序列化是一种常见的数据处理方式,可以将 Java 对象序列化为字节流,然后传输到其他计算机或存储到磁盘中。

Java序列化

Java 序列化是将 Java 对象转换为字节流的过程,以便于存储或网络传输。Java序列化的过程是将 Java 对象的状态信息保存到一个字节流中,包括对象的字段、属性、方法等信息。Java序列化的结果是一个字节流,可以通过网络传输或存储到磁盘中。当需要重新使用对象时,可以将字节流反序列化为 Java 对象,从而恢复对象的状态信息。

Java序列化、反序列化的基本用法

Java 序列化需要将目标对象实现 Serializable 接口,该接口没有任何方法,只是一个标记接口。以下是一个 Java 序列化的例子:

    private String name;
    private String password;

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }
	……一系列getter、setter

在上述例子中,User 类实现了 Serializable 接口,并包含了两个属性 name 和 password 。接下来,可以将 User 对象序列化为字节流,如下所示:

    User user = new User("huangbo", "1223456");
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
    objectOutputStream.writeObject(user);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
  • 第 1、2 行:创建了一个 User 对象一个ByteArrayOutputStream对象
  • 第 3 行:将 ByteArrayOutputStream 对象包装成ObjectOutputStream对象
  • 第4、5行:通过ObjectOutputStream对象调用 writeObject() 方法将 User 对象写入字节流中,再通过调用toByteArray()方法获取字节流数组。

接下来,可以将字节流反序列化为 User 对象,如下所示:

    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
    ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
    Student student = (Student) objectInputStream.readObject();

首先,创建了一个ByteArrayInputStream对象,将字节流数组包装成 ObjectInputStream 对象,最后调用 readObject 方法将字节流转换为 User 对象。需要注意的是,在读取对象时,需要将 ObjectInputStream 读取的对象转换为目标对象类型,并进行类型检查。

Java序列化的注意事项

尽管 Java 序列化非常方便,但也存在一些需要注意的事项。以下是一些需要注意的问题:

  • 序列化ID的问题

在 Java 序列化中,每个序列化类都有一个唯一的序列化ID,用于标识该类的版本。如果序列化类的字段发生变化,而序列化 ID 没有更新,则在反序列化时可能会出现版本不一致的问题。为了避免这种问题,建议在序列化类中手动指定序列化 ID,如下所示:

private static final long UID = 123456789L;

在指定序列化ID时,建议使用不同于默认值的常量值,并将其定义为 private static final 类型。

  • 序列化性能的问题

Java序列化的性能可能会受到一些因素的影响,如序列化对象的大小、序列化的深度、序列化的速度等。为了提高序列化性能,可以采用以下方法:

  • 减少序列化对象的大小:可以对序列化对象进行压缩或优化,减少序列化对象的大小,从而提高序列化性能。
  • 减少序列化的深度:可以通过使用transient关键字或Externalizable接口来控制序列化的深度,减少序列化的复杂度,从而提高序列化性能。
  • 增加序列化的速度:可以通过使用缓存或线程池等技术,提高序列化的速度,从而提高序列化性能。

JSON 和 Gson

JSON概述

JSON 是一种轻量级的数据交换格式,具有良好的可读性和可扩展性。它基于 ECMAScript 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。它有着简洁和清晰的层次结构,使得它成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON语法规则

JSON 数据由键值对组成,键和值之间用冒号分隔,键值对之间用逗号分隔。JSON 支持多种数据类型,包括字符串、数字、布尔值、数组和对象。以下是一个简单的 JSON 示例:

{
  "name": "黄博",
  "age": 20,
  "sex": true,
}
  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON的值可以是数字(整数或者浮点数),字符串(双引号中),逻辑值(true/false),数组(方括号中),对象(花括号中),null。

在Java中,可以使用 JSON 库将 Java对 象序列化为 JSON 格式的字符串,或将 JSON 字符串反序列化为 Java 对象。其中,Gson是一种常用的 JSON 库,下面将介绍 Gson 的使用方法。

Gson

Gson概述

Gson 是 Google 开发的一种Java库,用于将Java对象序列化为 JSON 格式的字符串,或将 JSON 字符串反序列化为 Java 对象。Gson 支持多种数据类型,包括基本数据类型、数组、集合和自定义对象。Gson 具有以下特点:

  • 简单易用:Gson 提供了简单的 API(Application Programming Interface),使得序列化和反序列化 Java 对象变得非常容易。
  • 灵活性高:Gson 支持多种数据类型和配置选项,可以根据实际需求进行灵活配置。
  • 性能优异:Gson 采用了高效的算法,能够快速地序列化和反序列化大量数据。

Gson的基本用法

在使用Gson进行序列化和反序列化之前,需要先导入Gson库。可以通过Maven或Gradle等构建工具进行导入,也可以手动下载Gson库并导入到项目中。

将 Java 对象序列化为 JSON 字符串

将 Java 对象序列化为 JSON 字符串的过程称为“序列化”。Gson 提供了简单的 API,使得序列化 Java 对象变得非常容易。以下是一个简单的例子:

User user = new User("huangbo", 1234564);
Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json);

在上面的例子中,首先创建了一个Person对象,然后创建了一个Gson实例,并将Person对象转换为JSON字符串。最后将JSON字符串输出到控制台。输出结果如下:

{"name":"huangbo","age":1234564}

可以看到,Gson将Person对象序列化为了一个JSON格式的字符串。

将 JSON 字符串反序列化为 Java 对象

将 JSON 字符串反序列化为 Java 对象的过程称为“反序列化”。Gson 提供了简单的 API,使得反序列化 JSON 字符串变得非常容易。以下是一个简单的例子:

String json = "{\"name\":\"huangbo\",\"password\":1234564}";
Gson gson = new Gson();
User user = gson.fromJson(json, User.class);
System.out.println(user.getName() + ", " + user.getAge());

在上面的例子中,首先创建了一个JSON字符串,然后创建了一个Gson实例,并将JSON字符串转换为Person对象。最后将Person对象的姓名和年龄输出到控制台。输出结果如下:

huangbo, 1234564

可以看到,Gson 将 JSON 字符串反序列化为了一个 User 对象。

Gson的高级用法之处理复杂数据类型

除了基本的序列化和反序列化功能外,Gson 还提供了一些高级功能,它支持处理复杂数据类型,如数组、集合和Map等。以下是一个处理复杂数据类型的例子:

List<User> users = new ArrayList<>();
users.add(new User("zhangsan", 123456));
users.add(new User("lisi", 654321));

Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json);

Type listType = new TypeToken<List<User>>(){}.getType();
List<User> users2 = gson.fromJson(json, listType);
System.out.println(users2);

在上面的例子中,我们创建了一个包含两个 User 对象的 List,然后使用 Gson 将 List 序列化为 JSON 字符串,并将 JSON 字符串反序列化为 List。可以看到,Gson 能够处理复杂数据类型,并将其序列化为 JSON 格式字符串。

基于 Gson 产生的工具 ArgumentMaker

在平时的编程练习中,我遇到了需要将参数进行传递和恢复的技术问题,所以在此给出 Argument Maker这样一个工具类,将所要传递的方法和参数转换为 JSON 字符串来实现参数的传递和恢复。

ArgumentMaker 工具实现:HB 个人博客:基于 Gson 的 ArgumentMaker 工具实现

总结:

JSON 和 Gson 是一种常用的数据格式和库,可以用于序列化和反序列化 Java 对象。Gson 具有简单易用、灵活性高、性能优异等特点,能够满足大部分的序列化和反序列化需求。Java 的序列化虽然也能够实现对象序列化和反序列化的功能,但需要注意序列化 ID 和性能等问题。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HB0o0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值