简述Java序列化的几种方式
目录
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
简述Java序列化的几种方式相关推荐
- [转载] Java序列化的几种方式以及序列化的作用
参考链接: Java中带有继承的对象序列化 文章转载自: 本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用 有的时候我们想要把一个 ...
- Java序列化的几种方式以及序列化的作用(文章有所改变)
本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用 有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从 ...
- Java序列化的3种方式
什么是序列化和反序列化 序列化:可以将对象转化成一个字节序列,便于存储. 反序列化:将序列化的字节序列还原. 优点:可以实现对象的"持久性", 所谓持久性就是指对象的生命周期不取决 ...
- Java序列化的几种方式
概念 序列化:可以将对象转化成一个字节序列,便于存储. 反序列化:将序列化的字节序列还原 优点:可以实现对象的"持久性", 所谓持久性就是指对象的生命周期不取决于程序 原生序列化方 ...
- java创建对象的五种方式
java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...
- Java 创建对象的 6 种方式,总有一种适合你
创建对象的 6 种方式 假设有个女朋友类: @Data @NoArgsConstructor @AllArgsConstructor class GirlFriend {private String ...
- Java技术分享:升级所安装Java版本的两种方式
在进行Java开发的时候我们可能会需要升级所安装的Java版本,那么你知道应该如何安装吗?小千今天就来给大家介绍两种方式. 一.卸载掉原本安装的Java,下载最新安装包安装即可. 这个步骤就不介绍了, ...
- python 执行shellcode_简述获取shellcode的几种方式
原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...
- Java操作Excel三种方式POI、Hutool、EasyExcel
Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...
最新文章
- ThunderSoft Flash to HTML5中文版
- bootstraptable 列隐藏_bootstrap中table如何隐藏列?
- 通过SectionIndexer实现微信通讯录
- 数据安全:英国公司泄露超过100万人的指纹和面部识别数据
- 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之二
- app与后台交互之间的几种安全认证机制
- Android PullToRefreshListView上拉刷新和下拉刷新
- windows下定时任务设置
- 当磁盘工具无法修复磁盘时,你可以这样做!
- 每天CookBook之JavaScript-073
- 19.Java 数据库编程
- 关于在联想电脑管家更新网卡驱动后无法显示可用网络wifi的问题!
- pandas groupby 数据丢失问题
- 这个对老爸老妈有好处
- 如何从Gitlab上拉取代码
- 我把一个人从我的微信里删除了,他怎么又进来了,确实删掉了,这是怎么回事?
- python报错:IndentationError:unindent does not match any outer indentation level
- win10使用技巧----便签固定到桌面
- 四大派围攻光明顶360摊上大事了
- 苹果cms播放页html,苹果CMS播放页被劫持跳转至qp网站的解决方案