序列化
什么是序列化和反序列化?
序列化:将对象转换为二进制数据
反序列化:将二进制数据转换为对象
- 目的:方便网络传输、持久化保存
Java 是怎么实现序列化的?
Java 通过对象输入输出流来实现序列化和反序列化,对象序列化不会关注类中的静态变量。
Java 的序列化过程:
- 对象及其属性都要必须属于
Enum
、Array
或Serializable
。 - 类中需要存在
serialVersionUID
字段,用来标明版本。 - 使用
ObjectOutputStream
进行序列化。
/**
* 序列化
*/
private static void serialize(String filename) throws IOException {
File f = new File(filename);
// 文件输出流
OutputStream out = new FileOutputStream(f);
// 对象输出流
ObjectOutputStream oos = new ObjectOutputStream(out);
// 保存对象
oos.writeObject(new Person("Jack", 30, Sex.MALE));
oos.close();
out.close();
}
/**
* 反序列化
*/
private static void deserialize(String filename) throws IOException, ClassNotFoundException {
File f = new File(filename);
// 文件输入流
InputStream in = new FileInputStream(f);
// 对象输入流
ObjectInputStream ois = new ObjectInputStream(in);
// 读取对象
Object obj = ois.readObject();
ois.close();
in.close();
System.out.println(obj);
}
可以使用 transient
关键字忽略掉某些字段
transient private Integer age = null;
常见的序列化协议有哪些?
- 二进制序列化
- Java 原生序列化:不能跨语言,性能较差,要求多
- Protobuf:Google 数据标准
- Thrift:Apache 开源项目
- Hessian
- Kryo
- FST
- Json 序列化
- Fastjson:阿里
- Jackson
- Gson:Google
网络 I/O
https://www.bilibili.com/video/BV1Lg4y1u7KW/
BIO/NIO/AIO 有什么区别?
- BIO(同步阻塞 IO):在读、写动作完成之前,线程会一直阻塞在那里,线性调用。
- BIO 会阻塞线程,一个连接一个线程。已经建立 Socket 连接后不能再与其他客户端连接。
- BIO 可以使用多线程和线程池优化
- NIO(同步非阻塞 IO):使用后台线程执行IO,前台线程轮询查看状态。
- NIO 性能消耗大,需要频繁轮询。
- 可以通过 I/O 多路复用优化
- AIO(异步非阻塞 IO):基于事件和回调机制,后台处理完成后,会通知相应线程进行后续工作。
I/O 多路复用是什么?
操作系统提供了一系列系统调用(select、poll、epoll),可以同时监控多个 fd 文件描述符(批量轮询)。
select 和 epoll 有什么区别?
select 的问题:
- 最大连接数有限
- 返回后通过遍历所有的 fd,找出就绪的 fd 进行下一步操作
epoll 的优势:
- 最大连接数无限
- 通过事件回调返回就绪的 fd