文章目录
前言
本人为了提升本人的编程能力、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 和性能等问题。