Java 和 JSON 序列化
JSON(JavaScript Object Notation)是一种基于文本的数据交换格式。几乎所有的编程语言都有很好的库或第三方工具来提供基于 JSON 的 API 支持,因此你可以非常方便地使用任何自己喜欢的编程语言来处理 JSON 数据。
本文主要从 Java 语言的角度来讲解 JSON 的应用。
JSON 简介
JSON 是什么
JSON 起源于 1999 年的 JS 语言规范 ECMA262 的一个子集(即 15.12 章节描述了格式与解析),后来 2003 年作为一个数据格式ECMA404(很囧的序号有不有?)发布。
2006 年,作为 rfc4627 发布,这时规范增加到 18 页,去掉没用的部分,十页不到。
Java 二进制序列化
简介
为什么需要二进制序列化库
原因很简单,就是 Java 默认的序列化机制(ObjectInputStream
和 ObjectOutputStream
)具有很多缺点。
不了解 Java 默认的序列化机制,可以参考:Java 序列化
Java 序列化工具
Java 官方的序列化存在许多问题,因此,很多人更愿意使用优秀的第三方序列化工具来替代 Java 自身的序列化机制。 如果想详细了解 Java 自身序列化方式,可以参考:Java 序列化
序列化库技术选型:
Netty 快速入门
Netty 简介
Netty 是一款基于 NIO(Nonblocking I/O,非阻塞 IO)开发的网络通信框架。
Netty 的特性
- 高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞 IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞 IO),他的并发性能得到了很大提高。
- 传输快:Netty 的传输依赖于内存零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。
- 封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。
Java I/O 之 简介
IO 即 Input/Output
(输入和输出),指的是:计算机内存与外部设备之间拷贝数据的过程。由于 CPU 访问内存的速度远远高于外部设备,因此 CPU 是先把外部设备的数据读到内存里,然后再进行处理。
UNIX I/O 模型
UNIX 系统下的 I/O 模型有 5 种:
- 同步阻塞 I/O
- 同步非阻塞 I/O
- I/O 多路复用
- 信号驱动 I/O
- 异步 I/O
Java I/O 之 BIO
BIO
BIO(blocking IO) 即阻塞 IO。指的主要是传统的 java.io
包,它基于流模型实现。流从概念上来说是一个连续的数据流。当程序需要读数据的时候就需要使用输入流读取数据,当需要往外写数据的时候就需要输出流。
java.io
包提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。很多时候,人们也把 java.net 下面提供的部分网络 API,比如 Socket
、ServerSocket
、HttpURLConnection
也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。
Java IO
📖 内容
- Java I/O 之 简介 - 关键词:BIO、NIO、AIO
- Java I/O 之 BIO - 关键词:BIO、InputStream、OutputStream、Reader、Writer、File、Socket、ServerSocket
- Java I/O 之 NIO - 关键词:NIO、Channel、Buffer、Selector、多路复用
- Java I/O 之序列化 - 关键词:Serializable、serialVersionUID、transient、Externalizable
Java NIO
NIO 简介
在传统的 Java I/O 模型(BIO)中,I/O 操作是以阻塞的方式进行的。也就是说,当一个线程执行一个 I/O 操作时,它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈,因为需要为每个连接创建一个线程,而线程的创建和切换都是有开销的。
为了解决此问题,在 Java 1.4 中引入了非阻塞的 I/O 模型——NIO(New IO,也称为 Non-blocking IO)。NIO 对应 java.nio
包,提供了 Channel
、Selector
、Buffer
等抽象。它支持面向缓冲的,基于通道的 I/O 操作方法。
深入理解 Java 序列化
序列化简介
由于,网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以需要提前把它转成可传输的二进制,并且要求转换算法是可逆的。