简述Java序列化的几种方式

article/2025/9/14 2:49:38

目录

JDK原生的序列化

字符串获取字节流

Protobuf

Protostuff

Thrift

kryo

hessian

fst

JSON字符串序列化

Jackson

Gson

FastJson


        序列化和反序列化在网络传输过程中需要做的事情。

        序列化 就是得的 字节流,反序列化就是得的对象。

        下面梳理Java编程需要用到的一些序列化技术。有些 序列化技术 不是简单的API调用,做了一些说明。其他一些简单的API调用只是提一下。

JDK原生的序列化

java.io.ObjectInputStream
java.io.ObjectOutputStream

字符串获取字节流

JDK的String 可以直接获取的 字节流 ,所以 最简单的就是 得到 字符串,比如Json字符串,直接调用 字符串的 getBytes方法 获取字节流。 那么也可以直接通过 String 的 构造方法 直接将字节流得的字符串

// 序列化
java.lang.String#getBytes()// 反序列化public String(byte bytes[], Charset charset) {this(bytes, 0, bytes.length, charset);}

Protobuf

使用 protobuf,首先需要创建 .proto 文件, 该文件 定义了 将 序列化的 结构 数据。

需要根据 规范 来创建 定义 .proto 文件,这个是首先需要 掌握的。

可以封装到公共的包来使用

步骤:

1. 创建 .proto 文件

syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.wxj.grpctest.auto";message RequestWxj {string name = 1;
}

2. protoc 生成 代码 或者 maven 插件生成代码

3. 使用,比如 使用 proto文件 生成了一个RequestWxj,就可以来完成 数据的序列化反序列化

// 序列化
RequestWxj.newBuilder().build().toByteArray();// 反序列化
RequestWxj.parseFrom(new byte[10]);

总结: protobuf 完成序列化和反序列化,就是 根据 .proto文件 生成了 目标 类文件,这个类文件 具有序列化和反序列化的功能,当然,是 protobuf 在生成类文件时 自动加上的功能,有了这些功能,就可以用这个类进行序列化和反序列化操作。

Protostuff

Thrift

官网

Apache Thrift - Home

Thrift 应该不是专门用来完成序列化反序列化的,他提供的是 RPC 的服务,简单示例如下:

1. 需要安装 thrift 工具包软件,用来生成 代码,可在官网下载

2. 项目添加maven依赖

      <dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId><version>0.16.0</version></dependency>

 3. 编写 .thrift文件

namespace java wxj.test.serializertest.thrift
struct MyPerson{
1:optional string userName;
}service MyThriftService{MyPerson hello(1:MyPerson myPerson);}

4. 根据 .thrift 生成 代码

thrift-0.16.0.exe -o F:\code\src\main\java -gen java F:\code\src\main\java\wxj\test\serializertest\thrift\Persion.thrift

可以用 -help来查看 具体用法

5.  说明一下生产的代码 怎么来使用

服务端:

public class MyServer implements MyThriftService.Iface{@Overridepublic MyPerson hello(MyPerson myPerson) throws TException {System.out.println("MyServer exe :" + myPerson);return myPerson;}
}

服务端启动:

    public static void main(String[] args) throws Exception{TNonblockingServerSocket serverSocket =new TNonblockingServerSocket(8803);THsHaServer.Args arg=new THsHaServer.Args(serverSocket).maxWorkerThreads(4).minWorkerThreads(2);MyThriftService.Processor<MyServer> processor =new MyThriftService.Processor<>(new MyServer());arg.protocolFactory(new TCompactProtocol.Factory());arg.transportFactory(new TFastFramedTransport.Factory());arg.processorFactory(new TProcessorFactory(processor));TServer tServer = new THsHaServer(arg);System.out.println("Running Simple Server");tServer.serve();

客户端:

        TTransport transport =null;try {transport = new TFramedTransport(new TSocket("127.0.0.1",8803),600);TProtocol protocol = new TCompactProtocol(transport);MyThriftService.Client client = new MyThriftService.Client(protocol);transport.open();MyPerson myPerson = new MyPerson();myPerson.setUserName("jack");MyPerson result = client.hello(myPerson);} catch (TException e) {e.printStackTrace();} finally {transport.close();}

如果会使用  protobuf,那么 理解 thrift 也不难。 同样需要 自定义文件,同样需要根据自定义文件来生成代码,同样是使用生成的代码来完成具体功能。

kryo

hessian

fst

JSON字符串序列化

        上面的几种序列化方式,是直接将字节流反序列化成不同的对象 或者 不同的对象 序列化成字节流。

        现在 服务之间数据传输是使用 JSON 格式。

        序列化之前 先转为JSON 字符串,再将字符串序列化成字节流;

        反序列化时,是将字节流反序列化成JSON字符串,再将JSON字符串 转为对象

Jackson

pom.xml 依赖

这个依赖会自动引入另外两个模块的依赖包

    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version><scope>compile</scope></dependency>

使用

// 核心代码
ObjectMapper objectMapper = new ObjectMapper();// 序列化
objectMapper.writeValueAsBytes(t);// 反序列化
objectMapper.readValue

Gson

FastJson


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

相关文章

java序列化之writeObject 和readObject

什么是序列化和反序列化&#xff1f; 序列化&#xff1a;将对象转化为字节的过程称为序列化过程。 反序列化&#xff1a;将字节转化为对象的过程称为反序列化。 序列化主要应用于网络传输和数据存储的场景。在java中&#xff0c;只有类实现了java.io.serializable接口&#x…

java序列化总结

目录 对象序列化是什么 为什么需要序列化与反序列化 序列化及反序列化相关知识 Java 序列化中如果有些字段不想进行序列化&#xff0c;怎么办&#xff1f; Java序列化接口 java.io.Serializable 使用序列化和serialVersionUID进行类重构 Java外部化接口 java.io.Externa…

java序列化接口Serializable

Serializable接口说明 类的可序列化性通过实现(implements) java.io.Serializable可序列化接口。 没有实现这个接口的类不会将其任何状态序列化或反序列化。 可序列化类的所有子类型本身可序列化。 序列化接口没有方法或字段只用于识别可序列化的语义。 为了允许序列化不可序…

Java序列化之serialVersionUID

Java序列化之serialVersionUID 今天讲一讲Java对象中的serialVersionUID&#xff0c;先从序列化讲起。 什么是序列化 序列化&#xff0c;简单的说&#xff0c;就是将一个对象转化&#xff08;编码&#xff09;成可以传输的输出流&#xff08;字节流&#xff09;。而反序列化…

一文了解Java序列化与反序列化

目录 序列化示例有父类的对象序列化Serializable和Externalizable区别序列化和反序列化实现serialVersionUID不一致有什么问题1、先注释掉反序列化代码, 执行序列化代码, 然后User类新增一个属性sex2、再注释掉序列化代码执行反序列化代码3、指定serialVersionUID 序列化字段修…

一篇搞懂java序列化Serializable

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途&#xff1a; 1&#xff09; 把对象…

Java序列化与数据传输

1&#xff09;什么是序列化 ① 序列化&#xff1a;Java 提供了一种对象序列化的机制&#xff0c;该机制中&#xff0c;一个对象可以被表示为一个字节序列&#xff0c;该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。 堆内存中的java对象数据&…

java序列化的作用

1.java序列化需要实现Serializaible接口或者Externalizable接口 2.java实现序列化的作用: 1.方便在远程调用时对象的解码与编码,就像new对象之间直接调用&#xff0c;不需要像传输对象之间像JSON转换一样转来转去 2.序列化的能力&#xff1a;为了在程序中能直接以对象的形式进…

Java序列化与反序列化

参考链接&#xff1a; Java 序列化与反序列化_Jacks丶的博客-CSDN博客_java反序列化 1 序列化与反序列化的概念 Java 序列化是指&#xff1a;将对象转化成一个字节序列(二进制数据)的过程。 将序列化对象写入文件之后&#xff0c;可以从文件中读取出来&#xff0c;并且对它…

Java序列化

一、什么是序列化&#xff1f;为什么要序列化&#xff1f; Java 序列化就是指将对象转换为字节序列的过程&#xff0c;而反序列化则是只将字节序列转换成目标对象的过程。 我们都知道&#xff0c;在进行浏览器访问的时候&#xff0c;我们看到的文本、图片、音频、视频等都是通…

【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…