一、I/O 什么是序列化?什么是反序列化?
如果我们需要持久化一个 Java 对象:比如将Java对象存储到文件中,或者将Java对象实现在网络中传输等,这些场景都需要用到序列化。
- 序列化: 将Java对象,转换成二进制字节流的过程。
- 反序列化:将在序列化过程中所生成的二进制字节流,转换成Java对象的过程。
二、Java序列化时如何禁止某些字段参与序列化?
对于不想进行序列化的变量,可以使用 transient
关键字修饰。
transient
关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient
修饰的变量值不会被持久化和恢复。
transient 注意事项:
transient
只能修饰变量,不能修饰类和方法。transient
修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰int
类型,那么反序列后结果就是0
。static
变量因为不属于任何对象(Object),所以无论有没有transient
关键字修饰,均不会被序列化。
三、Java中的 IO 流分为几种?
- 按照流的流向分为:输入流和输出流。
- 按照操作单元分为:字节流和字符流。
- 按照流的角色分为:节点流和处理流。
Java IO 流中的40多个类都是从如下4个抽象类中派生出来的:
- InputStream / Reader: 所有输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream / Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
1. 什么是节点流?
可以从或向一个特定的地方(节点)读写数据。FileReader、FileWriter、 FileInputStream、FileOutputStream等文件进行处理的都是节点流。
2. 什么是处理流?
它是一个已存在的流的连接和封装,通过封装后的流的功能调用,来实现数据的读写。处理流的构造方法总是要带一个其他的流对象作为其参数的。