Java序列化

article/2025/9/14 3:47:13

一、什么是序列化?为什么要序列化?

Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程。

我们都知道,在进行浏览器访问的时候,我们看到的文本、图片、音频、视频等都是通过二进制序列进行传输的,那么如果我们需要将Java对象进行传输的时候,是不是也应该先将对象进行序列化?答案是肯定的,我们需要先将Java对象进行序列化,然后通过网络,IO进行传输,当到达目的地之后,再进行反序列化获取到我们想要的对象,最后完成通信。

二、实现序列化

  1. 搭建项目

①User文件:

package com.yj.serializable.model;import java.io.Serializable;
import java.util.List;public class User implements Serializable{private static final long serialVersionUID = -3000940236094862245L;private Integer id;private List<Order> orderList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public List<Order> getOrderList() {return orderList;}public void setOrderList(List<Order> orderList) {this.orderList = orderList;}@Overridepublic String toString() {return "User [id=" + id + ", orderList=" + orderList + "]";}
}

 ②Order文件:

package com.yj.serializable.model;import java.io.Serializable;
import java.util.Date;
import java.util.Map;public class Order implements Serializable{private static final long serialVersionUID = 8904663608115454685L;private Integer id;private Date createTime;private Map<String,Item> itemMap;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Map<String, Item> getItemMap() {return itemMap;}public void setItemMap(Map<String, Item> itemMap) {this.itemMap = itemMap;}@Overridepublic String toString() {return "Order [id=" + id + ", createTime=" + createTime + ", itemMap=" + itemMap + "]";}
}

 ③Item文件:

package com.yj.serializable.model;import java.io.Serializable;public class Item  implements Serializable{private static final long serialVersionUID = -2190699842275360433L;private Integer id;private String itemName;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getItemName() {return itemName;}public void setItemName(String itemName) {this.itemName = itemName;}@Overridepublic String toString() {return "Item [id=" + id + ", itemName=" + itemName + "]";}
}

④UserUtil文件:

package com.yj.serializable.util;import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;import com.yj.serializable.model.Item;
import com.yj.serializable.model.Order;
import com.yj.serializable.model.User;public class UserUtil {public static User createUser() {User user = new User();user.setId((new Random().nextInt(10)));List<Order> orderList = new ArrayList<Order>();for (int j = 1; j <= 2; j++) {Order order = new Order();order.setId(j);order.setCreateTime(new Date());Map<String, Item> itemMap = new HashMap<String, Item>();for (int z = 1; z <= 2; z++) {Item item = new Item();item.setId(z);item.setItemName("item_" + z);itemMap.put("item_" + z, item);}order.setItemMap(itemMap);orderList.add(order);}user.setOrderList(orderList);return user;}public static List<User> createUserList() {List<User> userList = new ArrayList<User>();for (int i = 1; i <= 2; i++) {User user = createUser();userList.add(user);}return userList;}
}

⑤pom.xml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yj</groupId><artifactId>Serializable</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>Serializable</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath /></parent><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.16</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

  二.验证

 ①FastJson:

package com.yj.serializable;import java.util.List;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yj.serializable.model.User;
import com.yj.serializable.util.UserUtil;public class FastJson {private final static Logger logger = LoggerFactory.getLogger(FastJson.class);@Testpublic void testUser() {User user = UserUtil.createUser();logger.info("FastJson序列化前user:" + user);String userStr = JSON.toJSONString(user);logger.info("FastJson序列化后userStr:" + userStr);User user2 = JSONObject.parseObject(userStr,User.class);logger.info("FastJson反序列化后user:" + user2);}@Testpublic void testUserList() {List<User> userList = UserUtil.createUserList();logger.info("FastJson序列化前userList:" + userList);String userListStr = JSON.toJSONString(userList);logger.info("FastJson序列化后userListStr:" + userListStr);List<User> userList2 = JSONObject.parseArray(userListStr, User.class);logger.info("FastJson反序列化后userList:" + userList2);}
}

②GSON:

package com.yj.serializable;import java.util.List;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.yj.serializable.model.User;
import com.yj.serializable.util.UserUtil;public class GSON {private final static Logger logger = LoggerFactory.getLogger(GSON.class);public static Gson gson=new Gson();@Testpublic void testUser() {User user = UserUtil.createUser();logger.info("GSON序列化前user:" + user);String userStr = gson.toJson(user);logger.info("GSON序列化后userStr:" + userStr);User user2 = gson.fromJson(userStr,User.class);logger.info("GSON反序列化后user:" + user2);}@Testpublic void testUserList() {List<User> userList = UserUtil.createUserList();logger.info("GSON序列化前userList:" + userList);String userListStr = gson.toJson(userList);logger.info("GSON序列化后userListStr:" + userListStr);List<User> userList2 = gson.fromJson(userListStr,new TypeToken<List<User>>(){}.getType());logger.info("GSON反序列化后userList:" + userList2);}
}

③JackSon:

package com.yj.serializable;import java.util.List;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yj.serializable.model.User;
import com.yj.serializable.util.UserUtil;public class JackSon {private final static Logger logger = LoggerFactory.getLogger(JackSon.class);public static ObjectMapper mapper = new ObjectMapper();@Testpublic void testUser() {try {User user = UserUtil.createUser();logger.info("JackSon序列化前user:" + user);String userStr = mapper.writeValueAsString(user);logger.info("JackSon序列化后userStr:" + userStr);User user2 = mapper.readValue(userStr, User.class);logger.info("JackSon反序列化后user:" + user2);} catch (Exception e) {e.printStackTrace();}}@Testpublic void testUserList() {try {List<User> userList = UserUtil.createUserList();logger.info("JackSon序列化前userList:" + userList);String userListStr = mapper.writeValueAsString(userList);logger.info("JackSon序列化后userListStr:" + userListStr);List<User> userList2 = mapper.readValue(userListStr, new TypeReference<List<User>>() {});logger.info("JackSon反序列化后userList:" + userList2);} catch (Exception e) {e.printStackTrace();}}
}

三、对比

1.开源的Jackson

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
2.Google的Gson
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
3.阿里巴巴的FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。

综上3种Json技术的比较,在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,如果只是功能要求,没有性能要求,可以使用google的Gson,如果有性能要求,可以使用阿里巴巴的FastJson。
 


http://chatgpt.dhexx.cn/article/xiMZku4a.shtml

相关文章

【JAVA基础】java基础之-序列化详解

写在前面的话 脑子是个好东西&#xff0c;可惜的是一直没有搞懂脑子的内存删除机制是什么&#xff0c;所以啊&#xff0c;入行多年&#xff0c;零零散散的文章看了无数&#xff0c;却总是学习了很多也忘了很多。 痛定思痛的我决定从今天开始系统的梳理下知识架构&#xff0c;记…

JAVA的序列化

絮叨 Java序列化其实这个用的多不多&#xff0c;我觉得看公司的技术栈吧&#xff0c;如果用的是cloud那套&#xff0c;估计接触的会少点&#xff0c;但是也不是说没有&#xff0c;如果是dubbo那套的话&#xff0c;就多点&#xff0c;上次我们说Netty的编码解码的时候说到了谷歌…

MySQL卸载重新安装会遇到的问题及解决方式

好家伙&#xff0c;全踩雷了&#xff1a; 一.使用cd命令无法进入到其他盘符&#xff1f; 解决&#xff1a;在cd后加/d&#xff0c;两者之间用空格隔开 二.初始化时没有给出密码&#xff1f; 解决&#xff1a;仔细检查my.ini配置文件中的配置命令&#xff0c;一般是配置命令写错…

如何将MySQL卸载干净?

前言 前几天不知道什么情况电脑被莫名下载了MySQL8.0版本导致与本机的MySQL5.0版本冲突&#xff0c;导致MySQL无法正常运行&#xff0c;后来因为没有卸载干净MySQL导致一直下载不成功&#xff0c;导致我晚上失眠&#xff0c;现在让我们进入正题&#xff0c;看看如何将他卸载干…

【通关MySQL】Win11如何将MySQL卸载干净?

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f680;&#x1f680;系列专栏:【通关MySQL】 ✈️✈️本篇内容: MySQL如何卸载干净&#xff1f; ⛵⛵作者简介&#xff1a;一名双非本科大三在读的科班Java编程小白&#xff0c;道阻且长&#xff…

如何能将mysql卸载干净

本篇文章介绍一下如何干净卸载mysql。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。 第七步出现找不到相应的文件夹。第七步&#xff1a;路径是C:\Users\你的用户名字\AppData\Roaming\MySQL 有可能是隐藏的&#xff0c;需要显示隐藏…

如何将mysql卸载干净

一、在控制面板中卸载mysql软件 二、卸载过后删除C:\Program Files (x86)\MySQL该目录下剩余了所有文件&#xff0c;把mysql文件夹也删了 三、windowsR运行“regedit”文件&#xff0c;打开注册表 四、删除注册表&#xff1a;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Service…

MySQL卸载安装

目录 MySQL卸载安装 1. MySQL卸载&#xff08;8.0版本&#xff09; 1.1停止MySQL服务 1.2 卸载MySQL相关组件 1.3删除MySQL安装目录 1.4删除MySQL数据目录 1.5 删除MySQL注册表信息&#xff08;重要&#xff09; 2. MySQL安装&#xff08;5.7.24版本&#xff09; 2.1安装…

mysql卸载不_mysql卸载不干净解决方法

一、在控制面板中卸载mysql软件&#xff0c;此时mysql没有卸载干净。 二、卸载过后删除C:Program Files (x86)MySQL该目录下剩余了所有文件&#xff0c;把mysql文件夹也删了 三、windowsR运行“regedit”文件&#xff0c;打开注册表 四、删除注册表&#xff1a;HKEY_LOCAL_MACH…

MySQL的卸载与安装(附管理工具Navicat SQLyog)

本文MySQL为5.1.51版本&#xff0c;附全文所需文件压缩包&#xff08;百度云 提取码&#xff1a;8778&#xff09;&#xff0c;其中SQLyog和Navicat为MySQL的图形化工具&#xff0c;任选其一安装即可&#xff08;建议Navicat&#xff09; 1.MySQL卸载 如果之前没有安装过MySQ…

【 Windows、Mac 】Mysql 卸载、安装

文章目录 Windows Mysql 卸载、安装一、彻底卸载mysql二、安装mysql 5.7三、安装 mysql 8四、MySql服务开机自启动失败 Mac 安装 mysql一、下载对应mysql版本二、安装三、重置密码 Windows Mysql 卸载、安装 一、彻底卸载mysql 1、关闭 MySql 服务。 2、在控制面板卸载mysq…

MySQL卸载、安装与使用

一、MySQL卸载 1.关闭服务 点击win&#xff0c;输入服务&#xff0c;找到MySQL的服务&#xff0c;右击停止该服务 2.删除服务 点击win&#xff0c;输入cmd&#xff0c;选择管理员身份运行。打开cmd&#xff0c;输入sc delete mysql 3删除配置的MySQL环境变量 MySQLHOME和…

MySQL卸载不干净问题

解决MySQL卸载不干净或安装的时候安装不成功&#xff0c;输入密码一直检查不通过问题 MySQL卸载不干净&#xff0c;之后安装就会遇到很多问题&#xff0c;我也遇到了这种情况&#xff0c;裝了好久&#xff0c;一到这里就会有问题&#xff0c;尝试卸载了很多次然后在从新裝&…

mysql卸载详细教程

完整卸载MySQL数据库 1、关掉mysql服务 直接搜索服务或者右键“我的电脑”&#xff0c;选择“管理”&#xff0c;打开计算机管理&#xff0c;选择“服务”右键MySQL服务&#xff0c;选择“停止” 2、 卸载mysql程序 开始菜单->控制面板->程序和功能 3、 删除计算机上…

免装版mysql卸载

免装版mysql卸载: 1.停止mysql服务:以管理员身份打开cmd执行:net stop mysql 2.删除Mysql的注册表 winr 输入regedit打开注册表: 3.管理员cmd执行:mysqld -remove mysql 4.删除mysql之前的安装包:

MySQL卸载与安装

目录 1.MySQL卸载2.MySQL安装2.1获取mysql.zip2.1.1百度网盘链接2.1.2官网获取 2.2解压到自己想要安装的目录2.3初始化 MySQL2.4安装 MySQL 服务2.5修改登录密码2.6配置环境变量2.7其他问题2.7.1重置 MySQL 系统2.7.2忘记密码2.7.3版本切换2.7.4编码和 my.ini 设置2.7.5修改密码…

MySQL卸载

文章目录 将现有MySQL服务关闭&#xff08;必做&#xff09;确定自己MySQL的安装位置&#xff08;辅助工作&#xff09;方法1&#xff1a;适用于之前成功安装MySQL并完成环境变量配置的情况方法2&#xff1a;暴力搜索-适用于之前修改过安装位置的情况 在系统中卸载MySQL&#x…

mysql的卸载与安装(超详细)

1、卸载 1、首先&#xff0c;停止window的MySQL服务&#xff0c;【windows键R 】打开运行框&#xff0c;输入【services.msc】打开&#xff08;或者找到“控制面板”-> “管理工具”-> “服务”&#xff0c;停止MySQL后台服务&#xff09;服务管理器&#xff0c;停止MyS…

Windows10 彻底卸载 MySQL

如果要重新安装MySQL就必须将之前的MySQL进行彻底的卸载&#xff0c;本文将详细地介绍如何彻底卸载Windows10里的MySQL。 第一步&#xff1a;关闭MySQL服务器&#xff0c;MySQL服务器的关闭有两种方式。 方法一&#xff1a;在管理员终端命令里输入&#xff1a; net stop mys…

Java List转String数组与String数组转List

1. String数组转List String title "\t 10月上旬\t 10月中旬\t 10月下旬"; String[] arrTitles title.split("\t"); List<String> titleList Arrays.asList(arrTitles);1.1 方法一&#xff08;不推荐&#xff09; List<String> titleLis…