目录

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序列化的几种方式相关推荐

  1. [转载] Java序列化的几种方式以及序列化的作用

    参考链接: Java中带有继承的对象序列化 文章转载自:  本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用 有的时候我们想要把一个 ...

  2. Java序列化的几种方式以及序列化的作用(文章有所改变)

    本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从 ...

  3. Java序列化的3种方式

    什么是序列化和反序列化 序列化:可以将对象转化成一个字节序列,便于存储. 反序列化:将序列化的字节序列还原. 优点:可以实现对象的"持久性", 所谓持久性就是指对象的生命周期不取决 ...

  4. Java序列化的几种方式

    概念 序列化:可以将对象转化成一个字节序列,便于存储. 反序列化:将序列化的字节序列还原 优点:可以实现对象的"持久性", 所谓持久性就是指对象的生命周期不取决于程序 原生序列化方 ...

  5. java创建对象的五种方式

    java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...

  6. Java 创建对象的 6 种方式,总有一种适合你

    创建对象的 6 种方式 假设有个女朋友类: @Data @NoArgsConstructor @AllArgsConstructor class GirlFriend {private String ...

  7. Java技术分享:升级所安装Java版本的两种方式

    在进行Java开发的时候我们可能会需要升级所安装的Java版本,那么你知道应该如何安装吗?小千今天就来给大家介绍两种方式. 一.卸载掉原本安装的Java,下载最新安装包安装即可. 这个步骤就不介绍了, ...

  8. python 执行shellcode_简述获取shellcode的几种方式

    原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...

  9. Java操作Excel三种方式POI、Hutool、EasyExcel

    Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...

最新文章

  1. ThunderSoft Flash to HTML5中文版
  2. bootstraptable 列隐藏_bootstrap中table如何隐藏列?
  3. 通过SectionIndexer实现微信通讯录
  4. 数据安全:英国公司泄露超过100万人的指纹和面部识别数据
  5. 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之二
  6. app与后台交互之间的几种安全认证机制
  7. Android PullToRefreshListView上拉刷新和下拉刷新
  8. windows下定时任务设置
  9. 当磁盘工具无法修复磁盘时,你可以这样做!
  10. 每天CookBook之JavaScript-073
  11. 19.Java 数据库编程
  12. 关于在联想电脑管家更新网卡驱动后无法显示可用网络wifi的问题!
  13. pandas groupby 数据丢失问题
  14. 这个对老爸老妈有好处
  15. 如何从Gitlab上拉取代码
  16. 我把一个人从我的微信里删除了,他怎么又进来了,确实删掉了,这是怎么回事?
  17. python报错:IndentationError:unindent does not match any outer indentation level
  18. win10使用技巧----便签固定到桌面
  19. 四大派围攻光明顶360摊上大事了
  20. 苹果cms播放页html,苹果CMS播放页被劫持跳转至qp网站的解决方案

热门文章

  1. windows 01
  2. 软件构造学习笔记第三章1
  3. 7种 实现web实时消息推送的方案
  4. visio2010密钥
  5. 一个飞鸽传书2007进入后就可以不断的顺着链接爬行
  6. cc-project详细文档
  7. 《应用非线性控制》第一章(完)——介绍 1.3 本书的结构
  8. 过分依赖计算机的影响,技术的“两面性”过于依赖技术,会给生活带来什么影响?...
  9. uharc 使用详解
  10. 篮球投篮的乐趣,一个开始而已